前のセクションでは、ファイル バイトの入力および出力ストリームとファイル文字の入力および出力ストリームについて学習しました。このセクションでは、新しい概念であるバッファー ストリームについて学習します。では、バッファリングされたストリームとは何でしょうか?バッファーストリームはどのような役割を果たすことができますか?
Java では、 BufferedReader クラスとBufferedWriterクラスによって作成されたオブジェクトを、バッファリングされた入力ストリームと出力ストリームと呼びます。これにより、ファイルの読み取りと書き込みの機能が強化されます。たとえば、Student.txt は学生のリストであり、各名前が 1 行を占めています。名前を読みたい場合は、一度に 1 行を読み取る必要があります。FileReader ストリームを使用してこのようなタスクを完了するのは困難です。これは、1 行に何文字あるかが分からず、FileReader クラスではそれができないためです。行を読み取るメソッドを提供します。
Java は、より高度なストリーム、BufferedReader ストリームと BufferedWriter ストリームを提供します。両方のソースと宛先は文字入力ストリームと文字出力ストリームである必要があります。したがって、ファイル文字入力ストリームが BufferedReader ストリームのソースとして使用され、ファイル文字出力ストリームが BufferedWriter ストリームの宛先として使用される場合、BufferedReader クラスと BufferedWriter クラスによって作成されたストリームの読み取りと書き込みが強化されます。文字入力ストリームと文字出力ストリームの機能よりも優れています。たとえば、BufferedReader ストリームはファイルを 1 行ずつ読み取ることができます。
BufferedReader クラスと BufferedWriter のコンストラクターは次のとおりです。
BufferedReader(Readerin);BufferedWriter(Writerout);
BufferedReader ストリームは、 readLine()を使用してテキスト行を読み取ることができます。 FileReader のインスタンスなどの Reader サブクラスのオブジェクトを BufferedReader に渡すことによって、BufferedReader オブジェクトを作成します。次に例を示します。
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
次に、inTwo ストリームは readLine() メソッドを呼び出して Student.txt を読み取ります。次に例を示します。
StringstrLine=inTwo.readLine();
同様に、BufferedWriter ストリームと FileWriter ストリームを接続し、BufferedWriter ストリームを使用して宛先にデータを書き込むことができます。次に例を示します。
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
次に、out は BufferedReader クラスのメソッド write(String s, int off, int len) を使用して文字列 s を hello.txt に書き込みます。パラメーター off は s の先頭からのオフセットで、len は書き込まれる文字数です。 。
さらに、BufferedWriter ストリームには、ファイルに改行文字を書き込む独自のメソッドがあります。
newLine();
BufferedReader と BufferedWriter は上流ストリームと呼ばれ、それらが指す文字ストリームは下位ストリームと呼ばれます。Java はキャッシュ技術を使用して上流ストリームと下層ストリームを接続します。基礎となる文字入力ストリームは最初にデータをキャッシュに読み取り、次に BufferedReader ストリームがキャッシュからデータを読み取り、BufferedWriter ストリームがデータをキャッシュに書き込み、基礎となる文字出力ストリームがキャッシュ内のデータを宛先に連続的に書き込みます。 。 BufferedWriter ストリームが flash() を呼び出してキャッシュを更新するか、close() メソッドを呼び出して閉じると、キャッシュがオーバーフローしなくても、基になるストリームはキャッシュされたコンテンツをただちに宛先に書き込みます。
注: 出力ストリームを閉じるときは、まずバッファリングされた出力ストリームを閉じてから、バッファリングされた出力ストリームが指すストリームを閉じる必要があります。つまり、最初に上流ストリームを閉じてから下位ストリームを閉じる必要があります。コードを記述するときに上流ストリームを閉じるだけで、上流ストリームの基になるストリームが自動的に閉じられます。
例えば:
英語の文で構成されるファイル english.txt は次のとおりで、各文は 1 行を占めます。
矢は的を外れました。彼らは組合の要求を拒否しました。この道はどこへ行くのですか?
english.txt を 1 行ずつ読み取り、その行の後に英語の文に含まれる単語の数を追加し、その行を englishCount.txt という名前のファイルに書き込む必要があります。コードは次のとおりです。
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.txt);try{Writerout=newFileWriter(fWrite);BufferedWriterbufferWrite= newBufferedWriter(out);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null;while((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTokenizer(str);intcount=fenxi。 countTokens();str=str+文内の単語数:+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.close();out.close();in=newFileReader(fWrite) ;bufferRead =newBufferedReader(in);Strings=null;System.out.println(fWrite.getName()+content:);while((s=bufferRead.readLine())!=null){System.out.println( s) ;}bufferRead.close();in.close();}catch(IOExceptione){System.out.println(e.toString());}}}
実行結果は次のとおりです。
englishCount.txt 内容:Thearrowmissedthetarget.文中の単語数:5Theyrejectedtheuniondemand.文中の単語数:5Wheredoesthisroadgoto?文中の単語数:6