今日はやっと緩衝流とは何かが分かりました。

3243 ワード

原文の住所:
元々はBufferedReaderはInputStreamと交互に使うことができませんでした。
このInputStreamをBuffered Readerでカプセル化して、Data InputStreamでこのInputStreamをカプセル化します。こうすれば、まずBufferedierでストリームの中から一行を読み取って、それぞれこのInputStreamで1つの文字とData InputStreamを読み取って、Bufferedierでデータを読み込むことができます。InputStreamとData InputStreamはデータが読めません。データストリームの中には40文字以上しかありません。これは、バッファルダが初めて読んだ時に、この40文字以上を読み出して、バッファリングしました。後は読むたびにバッファから取り出すだけです。40文字以上がバッファロー・リードに読まれてキャッシュされたので、InputStreamとData InputStreamは文字が読めなくなりました。
原文では、データがバfferedereaderまで多く流れれば、InputStreamとData InputStreamはデータを読むことができると予想しています。
確かにそうです。BufferedReaderのソースコードの中には、

private static int defaultCharBufferSize = 8192;
これはデフォルトのバッファサイズで、バッファィディレクタが一度に読み込むと、このような複数の文字がキャッシュされます。
原文のプログラムを修正しました。

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TestByteArray {

	public byte[] generateByte() {
		//        ,             ,                ("\r
"), // , byte , ByteArrayInputStream String str = "a\r
bc\r
def\r
ghi\r
j\r
klmn\r
opqr\r
s\r
tuvwx"; // 40 。 StringBuffer buffer = new StringBuffer(); // , for(int i=0 ; i < 205; i++){ buffer.append(str); } str = buffer.toString(); System.out.println(str.length()); // return str.getBytes(); } public static void main(String[] args) throws IOException { TestByteArray self = new TestByteArray(); byte[] be = self.generateByte(); InputStream in = new ByteArrayInputStream(be); BufferedReader bufferReader = new BufferedReader(new InputStreamReader( in)); // DataInputStream Inputstream , // , , DataInputStream dataInputStream = new DataInputStream(in); // System.out.println("bufferReader=" + bufferReader.readLine()); // dataInputStream , System.out.println("dataInputStream=" + dataInputStream.readLine()); // inputstream , System.out.println("in=" + in.read()); // InputStream , BufferedReader , . System.out.println("bufferReader=" + bufferReader.readLine()); // , , , inputstream , // } }
この修正後のプログラムでは、ループを通して十分大きい文字列8200個を返し、BufferedReaderのデフォルトキャッシュを超えた結果、InputStreamとData InputStreamは文字が読めます。このプログラムを実行した結果は以下の通りです。

8200
bufferReader=a
dataInputStream=s
in=116
bufferReader=bc
ループを変更する回数は204で、文字列の長さは8160で、8192より小さいです。結果として、InputStreamとData InputStreamはデータが読めなくなりました。
これは、データをキャッシュし、バッファサイズは8192文字です。