java.io を使う
java.io パッケージの Stream, Reader, Writer について解説します。
Stream とは、データを扱う場合にデータを流れとして捉える抽象的な概念です。
データの読み込みには InputStream を、データの書き出しには OutputStream を使用します。
InputStream,OutputStream それぞれのサブクラスについて解説します。
index
FileInputStream,FileOutputStream は主にバイナリファイルのデータをバイト単位で読み書きする時に利用されます。
よく使うケースとしては、『ファイルのコピー方法』や
『Servlet でファイルをダウンロードする』で利用されます。
ソース記述例
OutputStream out = new FileOutputStream("c:/work/test.txt");
out.write(0x68);
out.write(0x6f);
out.write(0x67);
out.write(0x65);
out.close();
InputStream in = new FileInputStream("c:/work/test.txt");
byte[] buff = new byte[128];
int len;
while ((len = in.read(buff)) != -1) {
for (int i = 0; i < len; i++) {
System.out.println(buff[i]);
}
System.out.println(new String(buff, 0, len));
}
in.close();
ファイルの中身
hoge
出力結果
104
111
103
101
hoge
FileReader,FileWriter はテキストファイルのデータを char 単位で読み書きする時に利用されます。
直接使うより、他のフィルタを通して間接的に使う方が多いです。
ソース記述例
FileWriter out = new FileWriter("c:/work/test.txt");
out.write("hogeほげ");
out.close();
FileReader in = new FileReader("c:/work/test.txt");
char[] buff = new char[128];
int len;
while ((len = in.read(buff)) != -1) {
System.out.println(new String(buff, 0, len));
}
in.close();
ファイルの中身
hogeほげ
出力結果
hogeほげ
InputStreamReader と OutputStreamWriter は、Stream (byte 配列) を Reader,Writer の文字列を扱うクラスに
変換します。主に文字列の Encode を指定したい場合に使用します。
ソース記述例
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(
"c:/work/test.txt"), "Windows-31J");
out.write("ほげ〜@`\n");
out.write("―");
out.close();
InputStreamReader in = new InputStreamReader(new FileInputStream(
"c:/work/test.txt"), "Windows-31J");
char[] buff = new char[128];
int len;
while ((len = in.read(buff)) != -1) {
System.out.println(new String(buff, 0, len));
}
in.close();
ファイルの中身
ほげ〜@`
―
出力結果
ほげ〜@`
―
BufferedReader,BufferedWriter はテキストファイルを効率よく読み書きする為に使用されます。
メモリ上に文字をバッファリングする事により、実際にファイルに対する IO の回数を減らします。
テキストファイルを読み込む場合は、基本的に BufferedReader を使うのがお勧めで、
readLine メソッドで 1 行のテキストを読み込むことが可能です。1 行の終端は CR,LF,CRLF のいずれかになります。
ソース記述例
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("c:/work/test.txt"), "Windows-31J"));
out.write("ほげ〜@`\n");
out.write("―\r");
out.write("ほげ\r\n");
out.write("ほげ");
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream("c:/work/test.txt"), "Windows-31J"));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
ファイルの中身
ほげ〜@`
―
ほげ
ほげ
出力結果
ほげ〜@`
―
ほげ
ほげ
BufferedInputStream,BufferedOutputStream は主にバイナリファイルのデータをバイト単位で効率よく読み書きする為に使用されます。
BufferedReader と BufferedWriter と同様に、
メモリ上にバイト配列をバッファリングする事により、実際にファイルに対する IO の回数を減らします。
『ファイルのコピー方法』など、Stream を使用する時は、基本的に使用することをお勧めします。
ソース記述例
OutputStream out = new BufferedOutputStream(new FileOutputStream(
"c:/work/test.txt"));
out.write(0x68);
out.write(0x6f);
out.write(0x67);
out.write(0x65);
out.close();
InputStream in = new BufferedInputStream(new FileInputStream(
"c:/work/test.txt"));
byte[] buff = new byte[128];
int len;
while ((len = in.read(buff)) != -1) {
for (int i = 0; i < len; i++) {
System.out.println(buff[i]);
}
System.out.println(new String(buff, 0, len));
}
in.close();
ファイルの中身
hoge
出力結果
104
111
103
101
hoge
|