0

私はRandomAccessFile raFile固定サイズのチャンクでバッファにデータを読み込んでいます:

byte[] fileBuffer = new byte[BUFFER_SIZE];

while((readBytes = raFile.read(fileBuffer) >= 0) {
    String bufferStr = new String(fileBuffer, 0, readBytes);
    String testerStr = new String(fileBuffer);

    System.out.println(readBytes+","+bufferStr.length()+","+testerStr.length());
}

私が期待していたのは、 (ファイルの末尾を除く) と同じraFile.read()バイト数を読み取り、同じ値を にコピーすることでした。これはほとんど正しいですが、ときどき、4096の a に対して次の出力が得られます。BUFFER_SIZEreadBytesBUFFER_SIZE

readBytes bufferStr testerStr
 4096 4092 4092
 4096 4090 4090
 4096 4094 4094
 4096 4095 4095

4096 バイトを読み取っている場合、ファイルの終わりでなくても、長さがこの値以下になるのはなぜbufferStrですかtesterStr?

参照:これread()は、バッファに読み込まれた合計バイト数を返すと言います。

4

3 に答える 3

2

1 バイト以上必要な文字があるためです。bufferStr.length() は、バイト数ではなく、文字数を示します。

于 2012-05-11T12:00:59.660 に答える
1

読み取られたバイト数と、これらのバイトから作成された String 内の文字数には違いがあります。ストリームから読み取られるバイトは、常に 8 ビットです。文字列の文字は、最大 16 ビット (Unicode) を持つことができます。したがって、入力の 2 バイトは、作成された文字列の 1 文字になる可能性があります。

于 2012-05-11T12:02:19.397 に答える
0

パブロによる真のポイント。試す:

    System.out.println(readBytes+","+bufferStr.getBytes().length+
          +","+testerStr.getBytes().length);

そして結果を見る。

于 2012-05-11T12:04:24.773 に答える