今日はやっと緩衝流とは何かが分かりました。
原文の住所:
元々は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のソースコードの中には、
原文のプログラムを修正しました。
これは、データをキャッシュし、バッファサイズは8192文字です。
元々は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文字です。