InputStreamReaderクラス - 萌えJava超入門
テキストファイルを読み込む

InputStreamReaderクラス

InputStreamから受けたバイトを、文字にデコードします。
主に BufferedReaderの引数として使用します。

java.io.InputStreamReader

Point
次のページに紹介する BufferedReader を併用することで、
変換効率が向上します。

目次

1.概要


InputStreamから受けたバイトを、文字にデコードします。
正しくデコードするためには、テキストファイルの文字コードでデコードする必要があります。

効率的なデコードのために、BufferedReaderクラスを併用するのが一般的でが、
このページでは説明のため、InputStreamReaderクラスをそのまま使ってみます。
(BufferedReaderクラスは、次のページで扱います。)

萌えJava超入門
お急ぎの方は、
このページを飛ばして
BufferedReaderに行っても いいよ。
萌えJava超入門 萌えJava超入門
え?
いいんすか
そんな感じで?


2.継承関係


萌えJava超入門 萌えJava超入門
Readerって
こういう事ね?
InputStreamReaderの継承関係
    java.io.Reader  抽象クラス
       |
       └ java.io.InputStreamReader  クラス
  

重要
InputStream を テキストとして解釈(Read)します。



3.コンストラクタ


引数に、InputStream のインスタンスを与えます。
この章では、ファイルへの出力を行いますので、
InputStream のサブクラスである FileInputStreamクラスを使用します。

InputStreamReader は、与えられた InputStream を、文字として解釈します。
文字コードが複数バイトの場合でも適切に対応してくれます。
また、コンストラクタの第二引数に文字コードを指定することが可能です。

 public InputStreamReader(InputStream in)
            

public InputStreamReader(InputStream in, String charsetName)
  throws java.io.UnsupportedEncodingException

コンストラクタ 書式
InputStream in;
String charsetName;
 InputStreamReader reader
      = new InputStreamReader(in, charsetName);
import java.io.InputStreamReader; が必要です。

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.UnsupportedEncodingException;

第二引数に、文字コードを指定すると、指定した文字コードでの出力ができます。
基本的にはこちらの書式を使おうと思います。
    charsetName の例
  • "UTF-8"
  • "MS932"



4.readメソッド

readメソッドは、ストリームから単一の文字を読み込んで、文字コードを返します。
readメソッドを実行するたびに、次の文字コードを返します。
終端に達すると -1 を返します。

  public int read() throws java.io.IOException

readメソッド 書式
InputStreamReader reader;
   int inte = reader.read();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.IOException;

ストリームの終わりに達した場合
-1 を返します。

萌えJava超入門
FileInputStreamの
readメソッドと
全く同じなんスね。
萌えJava超入門
ホントね。



萌えJava超入門
だね。


5.closeメソッド

引数に与えた InputStream# を閉じてリソースを解放します。
読み込みが終わったら必ず closeします。

萌えJava超入門 萌えJava超入門
ストリーム(Stream)
閉じるんですね?



萌えJava超入門
そう。
コンストラクタで与えた
InputStreamクラスの
close()メソッドの事だ。
なので、InputStreamReaderで close()すれば、
あらためて InputStream#.close() を呼び出す必要はありません。

   public void close() throws java.io.IOException

closeメソッド 書式
InputStreamReader reader;
   reader.close();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.IOException;

萌えJava超入門 萌えJava超入門 萌えJava超入門


6.サンプルコード

前回同様 hello.txt を、wsディレクトリに配置しました。
Sample03_01 を wsディレクトリで実行して中身を読み込んでみましょう。
int byteData の値が、読み取った値です。

This is hello.txt
こんにちわ。
end

//Sample03_01.java

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.io.FileNotFoundException;
import java.io.IOException;

class Sample03_01{
  public static void main(String[] args){

      String path = "hello.txt";
      File file = new File(path);

      try {

          FileInputStream inStream = new FileInputStream(file);
          InputStreamReader reader = new InputStreamReader(inStream, "UTF-8");

          int byteData;
          while((byteData = reader.read()) != -1) {

            System.out.print((char)byteData);//改行なし
            /*System.out.println((char)byteData);//改行あり*/
          }
          reader.close();

      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e){
          e.printStackTrace();
      }
  }

}

コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample03_01.java
ws>java Sample03_01
This is hello.txt
こんにちわ。
end


萌えJava超入門
今回はSystem.out.printlnの代わりに
改行なしで表示する
System.out.printメソッドを使った。
萌えJava超入門
お~!
今度はそれらしくなったっス。
萌えJava超入門
ようやく使える見込みが
立ったわね。



お疲れ様でした。




© 2019 awasekagami