Java:从InputStream读取并不总是读取相同数量的数据

Cra*_*lus 5 java file-io zip inputstream java-ee

无论好坏,我一直在使用以下代码而没有任何问题:

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

我已经使用它(这种获取可用大小并直接读取到字节缓冲区的逻辑)用于FileI/O而没有任何问题,我也将它用于zip文件.

但最近我进入了一个案例,zipInput.read(content, 0, theSize);实际上读取的theSize可用空间少了3个字节.

并且由于代码不在循环中来检查返回的长度, zipInput.read(content, 0, theSize);我读取了最后3个字节丢失的文件,
之后程序无法正常运行(文件是二进制文件).

奇怪的是不同的较大尺寸的zip文件,例如1075字节(在我的情况下,有问题的zip条目是867字节)代码工作正常!

我知道代码的逻辑可能不是"最好的",但为什么我现在突然遇到这个问题?

如果我立即使用更大的zip条目运行程序,它怎么样?

任何意见都非常欢迎

谢谢

Ada*_*ski 7

来自InputStream readAPI文档:

尝试读取len个字节,但可以读取较小的数字.

......和:

返回:读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则返回-1.

换句话说,除非read方法返回-1,否则仍有更多数据可供读取,但您无法保证read完全读取指定的字节数.指定的字节数是上限描述最大它将读取的数据量.

  • @ user384706:了解特定行为没有任何目标:它取决于实现,并且您的代码可能会以多种方式出错,具体取决于许多因素.重要的是要理解为什么你的代码一般会出错以及如何修复它. (3认同)