Java:处理输入流中的大文件

时间:2012-01-17 15:24:28

标签: java zip large-files file-transfer

我有一个Java应用程序,它使用.zip获取相对较小的URL文件,将其保存在临时目录中,将其解压缩到本地计算机上并对其中一个文件进行一些更改。这一切都很有效。

但是,我通过以下方式通过.zip访问BufferedInputStream文件:

Url url = "http://somedomain.com/file.zip";
InputStream is = new BufferedInputStream(url.openStream(), 1024);

我担心这个应用程序实际上会用于传输非常zip个文件,我想知道BufferedInputStream是否真的是最好的方法,或者我是否会最终抛出某种类型的OutOfMemoryException

所以我的问题是,BufferedInputStream是否适合这项工作,或者我应该以完全不同的方式解决这个问题?

3 个答案:

答案 0 :(得分:6)

BufferedInputStream不会将所有文件加载到内存中,它只使用内部缓冲区,大小为1024字节= 1kb。它永远不会比这更大。如果您不会同时拥有多个流,则实际上可以增加该值。

编辑:您正在考虑的可能是ByteArrayOutputStream,其中数据保存在内存中。

答案 1 :(得分:1)

这取决于您对所阅读内容的处理方式。如果您读取内存中的所有内容,它将失败。如果你把它写到另一个流,那就没问题了。使用BufferedInputStream

答案 2 :(得分:1)

来自官方Java Tutorials - Buffered Streams

  

Java平台实现缓冲的I / O流。缓冲输入   流从称为缓冲区的存储区读取数据;本地的   仅当缓冲区为空时才调用输入API。同样,缓冲   输出流将数据写入缓冲区,而本机输出API则是   仅在缓冲区已满时调用。

还有一个很棒的SUN article

所以答案是:BufferedInputStream适合于这种性能意义上的工作。

是的,内存消耗并不是很大程度上取决于输入流的类型....