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> |
文字入力バッファリング用で、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の出力に変換されません。