Java:InputStreamからの読み込みが常に同じ量のデータを読み込むわけではありません

善または悪のために、私は何の問題もなく次のようなコードを使ってきました:

ZipFile aZipFile = new ZipFile(fileName);   
InputStream zipInput = aZipFile.getInputStream(name);  
int theSize = zipInput.available();  
byte[] content = new byte[theSize];  
zipInput.read(content, 0, theSize);

私はそれを使用しました(利用可能なサイズを取得してバイトバッファに直接読み込むというこのロジック)
 問題のないファイル入出力のために、私は同様にzipファイルでそれを使用しました。

しかし最近私はzipInput.read(content、0、theSize)というケースに踏み込んだ。実際にはtheSizeが利用可能なサイズより3バイト少なくなります。

そして、コードはzipInput.read(content、0、theSize)によって返された長さをチェックするためのループに入っていないので。最後の3バイトが欠けているファイルを読みました
その後、プログラムは正しく機能できません(ファイルはバイナリファイルです)。

より大きなサイズの異なるzipファイルで十分に奇妙な1075バイト(私の場合は問題のあるzipエントリは867バイト)、コードは問題なく動作します。

コードのロジックはおそらく「最善」ではないことを私は理解していますが、なぜ私が突然この問題を起こしているのですか?

そして、もっと大きなzipエントリを使ってすぐにプログラムを実行するとどうなりますか?

どんな入力でも大歓迎です

ありがとう

ベストアンサー
InputStream read APIドキュメントから:

An attempt is made to read as many as len bytes, but a smaller number
may be read.

…そして:

Returns: the total number of bytes read into the buffer, or -1 if
there is no more data because the end of the stream has been reached.

言い換えると、readメソッドが-1を返さない限り、読み取ることができるデータがまだありますが、readが正確に指定されたバイト数を読み取ることを保証することはできません。指定されたバイト数は、それが読み取るデータの最大量を表す上限です。

転載記事の出典を記入してください: Java:InputStreamからの読み込みが常に同じ量のデータを読み込むわけではありません - コードログ