我有一个Java应用程序,它使用.zip
获取相对较小的URL
文件,将其保存在临时目录中,将其解压缩到本地计算机上并对其中一个文件进行一些更改。这一切都很有效。
但是,我通过以下方式通过.zip
访问BufferedInputStream
文件:
Url url = "http://somedomain.com/file.zip";
InputStream is = new BufferedInputStream(url.openStream(), 1024);
我担心这个应用程序实际上会用于传输非常大zip
个文件,我想知道BufferedInputStream
是否真的是最好的方法,或者我是否会最终抛出某种类型的OutOfMemoryException
?
所以我的问题是,BufferedInputStream
是否适合这项工作,或者我应该以完全不同的方式解决这个问题?
答案 0 :(得分:6)
BufferedInputStream不会将所有文件加载到内存中,它只使用内部缓冲区,大小为1024字节= 1kb。它永远不会比这更大。如果您不会同时拥有多个流,则实际上可以增加该值。
编辑:您正在考虑的可能是ByteArrayOutputStream,其中数据保存在内存中。
答案 1 :(得分:1)
这取决于您对所阅读内容的处理方式。如果您读取内存中的所有内容,它将失败。如果你把它写到另一个流,那就没问题了。使用BufferedInputStream
答案 2 :(得分:1)
来自官方Java Tutorials - Buffered Streams:
Java平台实现缓冲的I / O流。缓冲输入 流从称为缓冲区的存储区读取数据;本地的 仅当缓冲区为空时才调用输入API。同样,缓冲 输出流将数据写入缓冲区,而本机输出API则是 仅在缓冲区已满时调用。
还有一个很棒的SUN article。
所以答案是:BufferedInputStream
适合于这种性能意义上的工作。
是的,内存消耗并不是很大程度上取决于输入流的类型....