私は4000バイトの0をファイルtest.txt
に書き込む次のコードを書いています。次に、同じファイルを一度に1000バイトのチャンクで読み込みます。ObjectInputStreamを使用して同時に1024バイトしか読み込めないのはなぜですか?
FileOutputStream output = new FileOutputStream("test.txt");
ObjectOutputStream stream = new ObjectOutputStream(output);
byte[] bytes = new byte[4000];
stream.write(bytes);
stream.close();
FileInputStream input = new FileInputStream("test.txt");
ObjectInputStream s = new ObjectInputStream(input);
byte[] buffer = new byte[1000];
int read = s.read(buffer);
while (read > 0) {
System.out.println("Read " + read);
read = s.read(buffer);
}
s.close();
私は1000バイトを4回読み込むことが予想されます。
Read 1000
Read 1000
Read 1000
Read 1000
しかし、実際に何が起こるかは、私はすべての1024バイト(もっと良い言葉がないために)、「一時停止」を取得するように見えるということです。
1024バイト以上を読み込もうとすると、1024バイトに制限されます。 1024バイト未満を読み込もうとすると、1024バイト目で一時停止する必要があります。
出力ファイルtest.txt
を16進数で調べると、ファイルに0だけ書き込んだにもかかわらず、0以外のバイトのシーケンスが7A 00 00 04 00
1029バイト離れていることに気付きました。 Here is the output from my hex editor.(質問に答えるには時間がかかりすぎますか)
私の質問は次のとおりです。なぜ完全に0を書いたときに、これらの5バイトがファイルに表示されるのですか?これらの5バイトは、1024バイトごとに発生する一時停止と関係がありますか?なぜこれが必要ですか?
'InputStream.read(byte [])'は、できるだけ多くを読み込むことを保証しません。あなたが記述している「短読」の動作は、ファイルベースの入力であっても完全に合法です。したがって、バッファ全体を読み込みたい場合は、 'DataInput.readFully(byte [])'を使います。 – Nayuki
@NayukiMinase私は理解しています。しかし、なぜそれが1024バイトのマークで一時停止するのか説明してください。たとえば、最大1024バイトしか読み込めないのであれば、それは意味をなさないでしょう。結果は1024,1024,1024,928になります。しかし、なぜ最初の1000バイトを読み込むのか混乱しますが、それは次の24バイトだけを読み取ってから、再び続行することができます。これは完全に恣意的ですね?それとも理由がありますか? – Zsw
私は分かりません。しかし、ObjectInputStreamとObjectOutputStreamのどちらのJavadocもバイト配列の書式について何も言わないので、私が言及した5バイトのシーケンスに困惑しています。 – Nayuki