FileInputStream.read(byte [])有什么问题?

Ton*_*ony 7 java fileinputstream java-io

在回答我对文件阅读问题的回答时,一位评论者表示FileInputStream.read(byte[])"不能保证填补缓冲区".

File file = /* ... */  
long len = file.length();
byte[] buffer = new byte[(int)len];
FileInputStream in = new FileInputStream(file);
in.read(buffer);
Run Code Online (Sandbox Code Playgroud)

(代码假定文件长度不超过2GB)

除了IOException,什么可能导致该read方法无法检索整个文件内容?

编辑:

代码的概念(以及我回答的问题的OP的目标)是将整个文件一次性读入一块内存,这就是buffer_size = file_size的原因.

Mic*_*rdt 6

什么可能导致read方法无法检索整个文件内容?

例如,如果文件在文件系统上被分段,并且低级实现知道它必须等待HD寻找下一个片段(这相对于CPU操作需要很多时间),如果read()返回的调用返回部分缓冲区未填充,则应用程序有机会对已收到的数据执行某些操作.

现在我不知道是否有任何实现实际上是这样的,但重点是你不能依赖缓冲区被填充,因为它不能由API契约保证.


aio*_*obe 5

除了IOException之外,什么可能导致read方法无法检索整个文件内容?

在我自己的API实现中,在我的家庭滚动文件系统中,我只是选择填充缓冲区的一半......开个玩笑.

我的观点是,即使我不是在开玩笑,从技术上讲,它不会是一个错误.这是方法契约的问题.这是这种情况下的合同(文件)是:

将此输入流中的最多 b.length数据字节读字节数组.

即,它不能保证填充缓冲区.

根据API实现,可能在文件系统上,该read方法可能选择不填充缓冲区.这基本上是该方法的合同所说的问题.


一句话:可能有效,但不能保证有效.