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的原因.
什么可能导致read方法无法检索整个文件内容?
例如,如果文件在文件系统上被分段,并且低级实现知道它必须等待HD寻找下一个片段(这相对于CPU操作需要很多时间),如果read()返回的调用返回部分缓冲区未填充,则应用程序有机会对已收到的数据执行某些操作.
现在我不知道是否有任何实现实际上是这样的,但重点是你不能依赖缓冲区被填充,因为它不能由API契约保证.
除了IOException之外,什么可能导致read方法无法检索整个文件内容?
在我自己的API实现中,在我的家庭滚动文件系统中,我只是选择填充缓冲区的一半......开个玩笑.
我的观点是,即使我不是在开玩笑,从技术上讲,它不会是一个错误.这是方法契约的问题.这是这种情况下的合同(文件)是:
将此输入流中的最多
b.length数据字节读入字节数组.
即,它不能保证填充缓冲区.
根据API实现,可能在文件系统上,该read方法可能选择不填充缓冲区.这基本上是该方法的合同所说的问题.
一句话:它可能有效,但不能保证有效.
| 归档时间: |
|
| 查看次数: |
3736 次 |
| 最近记录: |