行単位の入(出)力BufferedReader (BufferedWriter)

BufferedReaderクラス

Windowsのメモ帳を使うと右のように見えるLinuxのファイルを、
行単位で読み取るプログラムの紹介します。

前ページで、文字単位で読み取るプログラムを紹介しました。
⇒(確認後はブラウザの戻る操作で戻ってください

以下にこの"test.txt"ファイルの16進ダンプを示します。

0000 61 62 63 0D 0A A1 A1 A4 A2 A4 A4 A4 A6 A4 A8 A4
0010 AA 0D 0A 20 31 32 33 34 35 0D 0A B3 D8 B9 BB

このファイルを行単位で処理する場合は、BufferedReaderクラスを次のように使います。
BufferedReaderクラスは、 文字ストリームを利用して行単位で文字列を取り出せる ラインバッファリング用のクラスです。
BufferedReaderクラスのクラスのコンストラクタは、 文字バッファリングのInputStreamReaderオブジェクトを引数にします。

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Test
{
	public static void main(String[] arg) throws Exception
	{
		//EUCのファイル test.txtを読み込む
		FileInputStream fis = new FileInputStream("test.txt");//バイトストリーム
		InputStreamReader isr = new InputStreamReader(fis, "EUC_JP");//文字ストリーム
		//文字ストリームから行ストリームを生成
		BufferedReader br = new BufferedReader(isr);
		String s;
		while ((s = br.readLine()) != null)//1行単位で取り出す繰り返し
		{
			System.out.println(s);//1行表示
		}
		br.close();//生成した順と逆の順で閉じる
		isr.close();
		fis.close();
	}
}



D:\java>java Test
abc
 あいうえお
 12345
学校

D:\java>













FileInputStreamのbyteストリームから、InputStreamReaderの文字ストリームを作り
InputStreamReaderの文字ストリームから、BufferedReaderの行ストリームを作り
BufferedReaderの行ストリームオブジェクトのreadLineメソッドで、改行まで1行のStringデータを取り出しています。
readLineメソッドは、ストリームの最後でnullを返します。この時に最後が改行でなくても、 最後の文字列を取り出して、その次のreadLineメソッドでnullが返していることに注意ください。
(上記例の"test.txt"の最後は改行がありませんが、 B3 D8 B9 BB学校を読み取り、その次の繰り返しがnullで終了しています。)

なお、Java言語のコンソールプログラムにおいてキー入力する場合、 コンソールからの入力ストリームを利用したBufferedReaderがよく使われています。
それは、上記FileInputStreamのbyteストリームの代わりに、 System.inのInputStreamで
InputStreamReaderの文字ストリームを作り
そのInputStreamReaderの文字ストリームから、BufferedReaderの行ストリームを作り
そのreadLineメソッドで、キー入力の1行文字列を取得する方法です。
以下に3行入力して、表示するプログラム例を示します。

import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Test
{
	public static void main(String[] arg) throws Exception{
		String []a = new String[3];
		
		InputStreamReader isr = new InputStreamReader(System.in);//文字ストリーム
		//文字ストリームから行ストリームを生成
		BufferedReader br = new BufferedReader(isr);
		
		for (int i=0; i < a.length; i++){//1行単位で取り出す繰り返し
			System.out.print("1行の文字列入力>>");
			a[i] = br.readLine();
		}
		for (int i = 0; i < a.length; i++){//1行単位で取り出す繰り返し
			System.out.println(i + 1 + "行目入力文字列:" + a[i]);
		}
	}
}
D:\java>java Test
1行の文字列入力>>abc
1行の文字列入力>>  123 wxzy
1行の文字列入力>>あいう
1行目入力文字列:abc
2行目入力文字列:  123 wxzy
3行目入力文字列:あいう
D:\java>












BufferedWriterクラス

文字入力バッファリング用で、InputStreamReaderクラスがあるように、
文字出力バッファリング用にOutputStreamWriterクラスが用意されています。
入力用クラスに対して出力クラスがあるわけす。そして
文字入力用でBufferedReaderクラスがあるように、
文字出力用でBufferedWriterクラスが用意されています。
以下で、ページ冒頭の"test.txt"のファイルプログラムを、BufferedWriterクラスを使った例で示します。

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;

public class Test
{
	public static void main(String[] arg) throws Exception
	{
		//EUCのファイル test.txtを作成
		FileOutputStream fos = new FileOutputStream("test.txt");
		OutputStreamWriter osw = new OutputStreamWriter(fos, "EUC_JP");//EUCエンコード 
		BufferedWriter bw = new BufferedWriter(osw);// 文字列バッファ
		bw.write("abc");
		bw.newLine();//改行出力
		bw.write(" あいうえお");
		bw.newLine();
		bw.write(" 12345");
		bw.newLine();
		bw.write("学校");
		bw.close();//生成した順と逆の順で閉じる
		osw.close();
		fos.close();
	}
}

上記で示すようにnewLine()を使わないと、そのシステムのテキスト用改行コードが出力されません。 Windowsで動作る場合は、0x0d,0x0aの出力になります。
bw.write(" あいうえお\n 12345");のような出力で、\nが0x0d,0x0aの出力に変換されません。