0

Java アプリケーションが一度に 6 バイトを読み取る入力として受け取るファイルがあります。ファイルシステムから読み込んだ場合、すべて正常に動作します。すべてをjarにビルドすると、最初の4868回の読み取りは正常に機能しますが、その後、バイト配列が間違った順序で返され始め、最後にさらにデータを読み取ることになります。

問題を再現するコードの簡略版を次に示します。

     InputStream inputStream = this.getClass().getResourceAsStream(filePath);
     byte[] byteArray = new byte[6];
     int counter = 0;
     while ((inputStream.read(byteArray) != -1))
     {
        counter++;
        System.out.println("Read #" + counter +": " + Arrays.toString(byteArray));
     }
     System.out.println("Done.");

これは、ファイル システムから読み取ったときに得られる [省略された] 出力です。

...
Read #4867: [5, 0, 57, 7, 113, -26]
Read #4868: [2, 0, 62, 7, 114, -26]
Read #4869: [2, 0, 68, 7, 115, -26]
Read #4870: [3, 0, 75, 7, 116, -26]
Read #4871: [2, 0, 83, 7, 117, -26]
...
Read #219687: [1, 0, 4, -8, 67, 33]
Read #219688: [1, 0, 2, -8, 68, 33]
Read #219689: [5, 0, 1, -8, 67, 33]
Done.

そして、これが私が瓶から読んでいるものです:

...
Read #4867: [5, 0, 57, 7, 113, -26]
Read #4868: [2, 0, 62, 7, 113, -26] //everything is fine up to this point
Read #4869: [7, 114, -26, 2, 0, 68]
Read #4870: [7, 115, -26, 3, 0, 75]
Read #4871: [7, 116, -26, 2, 0, 83]
...
Read #219687: [95, 33, 1, 0, 78, -8]
Read #219688: [94, 33, 1, 0, 76, -8]
Read #219689: [95, 33, 1, 0, 74, -8]
...
Read #219723: [67, 33, 1, 0, 2, -8]
Read #219724: [68, 33, 5, 0, 1, -8]
Read #219725: [67, 33, 5, 0, 1, -8]
Done.

jar を解凍し、読み込まれているファイルが同一であることを確認しましたが、リーダーが異なる結果を返す原因は何でしょうか?

4

1 に答える 1

2

あなたの読書ループは間違っています。 inputStream.read()メソッドは、実際に読み取ったバイト数を返します。データを文字列に変換する前に、この数値を確認する必要があります。

ファイルから読み取っている場合、バイトはすべて一緒に到着しません。ループの反復の 1 つで、予想される 6 バイトのうち 4 バイトを読み取る可能性があるため、文字列への変換は機能しません。整数を読んでいる場合は、Scannerまたは古き良きを使用して生の入力文字列をラップし、DataInputStream整数を直接読み取ることをお勧めします。

于 2012-10-24T16:41:01.160 に答える