【发布时间】: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