当您需要通过各种方法运行字节时,如何在java中处理大文件?
之前我这样做的方式是这样的:
private byte[] inputStreamToByteArray(InputStream inputStream) {
BufferedInputStream bis = BufferedInputStream(inputStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int nRead;
while((nRead = bis.read(buffer)) != -1) {
baos.write(buffer, 0, nRead);
}
return baos.toByteArray();
}
我得到一个java内存不正确的错误,因为我的字节数组太大了。
所以我尝试将流串在一起,但我不确定这是否是正确的方法,因为我对流不够了解。
是否应该使用字节数组中的块来处理大文件,还是通过传递输入流?
答案 0 :(得分:2)
是否应该使用字节数组中的块来处理大文件,还是通过传递输入流?
应该从8192字节的块中读取大文件,就像在示例中一样。而不是将数据复制到数组并处理数组,只需在读取数据时处理数据。
答案 1 :(得分:1)
或者:
通过内存映射文件处理文件。处理至少2GB大小 - 如果你想要贡献那么多的内存!与操作系统本机IO线程和内存缓冲区集成,以提高性能。
java.nio.MappedByteBuffer buff = file.getChannel.map();
然后访问缓冲区的各个部分 - 它们将依次分页到java内存中,所以仍然会发生一些IO分块。但从逻辑上讲,对于您的程序来说,它看起来好像在处理整个文件(在分页期间I / O性能有一些抽象泄漏)。
在阅读时处理块 - 而不是附加到不断增长的ByteArrayOutputStream。为了处理块:读取足够大的块以使它们对您的程序有意义。或者将这些部分聚合到它们具有意义的点,并且可以在下次读取之前对其进行处理和丢弃。
通常(2)表现良好,但(1)表现良好,偶尔会更简单,但内存更昂贵。
另请参阅:Most Robust way of reading a file or stream using Java (To prevent DoS attacks)
:)