【问题标题】:JAVA: Byte array allocation in InputStream.read(byte[] b, int off, int len)JAVA:InputStream.read(byte[] b, int off, int len) 中的字节数组分配
【发布时间】:2015-10-06 19:11:28
【问题描述】:

我有一个大文件,我想从中获取分成 20,000,000 字节块的字节。

我写了这样的代码:

File clipFile = new File("/home/adam/Temp/TheClip.mp4");
InputStream clipIStream = new FileInputStream(clipFile);

long chunkSize = 20000000;

long fileSize = clipFile.length();
long totalParts = (long) Math.ceil(fileSize / chunkSize);

for(int part=0; part < totalParts; part++) {
    long startOffset = chunkSize * part;
    byte[] bytes = new byte[(int)chunkSize];
    clipIStream.read(bytes, (int) startOffset, (int) chunkSize));

    // Code for processing the bytes array
    // ...
}

程序在第一次迭代后崩溃,生成IndexOutOfBoundsException

咨询the documentation后发现如下:

公共 int 读取(字节 [] b, 关闭, 国际化) 抛出 IOException

(...)

读取的第一个字节存储到元素 b[off] 中,下一个字节存储到 b[off+1],以此类推。

这意味着,在第二次迭代中,read 开始写入位置字节 [20000000],而不是我想要的字节 [0]。

有什么方法可以实现在每次迭代时在字节数组的开头写入字节?

【问题讨论】:

  • 是的 - 你传入 0 作为第二个参数......就这么简单。请注意,您不应该假设您每次都能读取整个块 - 您应该使用read 的返回值来查看您实际读取了多少字节。此外,您可能希望在所有迭代中重用相同的字节数组...
  • 感谢您的评论,现在我可以正常工作了
  • 我刚刚注意到您的更新答案。您提出了很好的观点,尤其是在使用 read 的返回值时。我很快发现字节数组的固定大小是个问题。再次感谢您。

标签: java file byte bytearray inputstream


【解决方案1】:

不要将startOffset 传递给the read method

off - 数组 b 中写入数据的起始偏移量。

偏移量在数组中,而不是在流中。改为传递0,从数组的开头写入。

【讨论】:

  • 那么这意味着read只是在InputStream中移动了内部指针,对吗?
  • 太棒了,一切都清楚了。谢谢您的帮助。过了时限,我会接受你的回答。
猜你喜欢
  • 2014-10-08
  • 2011-06-13
  • 2018-01-09
  • 1970-01-01
  • 2013-09-06
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多