InputStreamReader/OutputStreamWriterクラス
テキストファイルの操作 – InputStreamReader/OutputStreamWriterクラス- InputStreamReader(InputStream in [,String char])
- OutputStreamWriter(OutputStream out [,String char])
- in:入力ストリーム
- out:出力ストリーム
- char:文字コード(UTF-8、EUC_JP、Windows-31J(Shift-JIS)など)
テキストファイルを読み書きするには、FileInputStream/FileOutputStreamクラスをInputStreamReader/OutputStreamWriterクラスで文字ストリーム(Reader/Writer)に変換します。それぞれのクラスで利用できるメソッドは、以下の通りです。
| FileInputStream/FileOutputStreamクラスの主なメソッド | ||
|---|---|---|
| クラス | メソッド | 概要 |
| FileInputStream | int read([byte[] b [,int off, int len]]) | 入力ストリームからバイト配列bに読み込み (offは開始位置、lenは読み込み長) |
| long skip(long n) | 読み込みをnバイトだけスキップ | |
| void close() | ストリームを閉じる | |
| FileOutputStream | void write(byte[] b [,int off, int len] | バイト配列bの内容を出力ストリームに書き出し (offは開始位置、lenは読み込み長) |
| void close() | ストリームを閉じる | |
たとえば以下はsample.jpgを読み込み、その内容をそのままsample2.jpgに書きだす例です。
StreamBinary.java
package com.example.mynavi.stream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamBinary {
public static void main(String[] args) {
try (FileInputStream in = new FileInputStream("C:/data/sample.jpg");
FileOutputStream out = new FileOutputStream("C:/data/sample2.jpg")) {
int data;
while ((data = in.read()) != -1) {
out.write((byte) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream/FileOutputStreamコンストラクターで操作対象のパスを指定することで、それぞれファイルを読み取り/書き込み専用で開けます。
ファイルからバイトデータを読み込むにはreadメソッドを利用します。readメソッドは、読み込みに成功した場合はその値を、読み込むべきデータがなかった場合には-1を返します。上では、その性質を利用して、readメソッドが-1を返すまでwhileループを繰り返すことで、ファイルの内容をすべて読み込めます。
バイトデータは、writeメソッドを利用することで、対象のファイルに書き込みます。
try-with-resource構文
ファイルなど共有のリソースを利用する際には、tryブロック直後のカッコで宣言します。これによって、リソースはtryブロックを抜けるタイミングで自動的に解放されますので、いわゆる「ファイルの閉じ忘れ」を防げます。この構文は、JavaSE 7で新たに追加された構文で、try-with-resources構文と呼ばれます。






