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

3
我有一个Java应用程序,使用URL获取一个相对较小的.zip文件,并将其保存在临时目录中,然后将其解压缩到本地计算机上并更改其中一个文件。这一切都很顺利。
但是,我是通过以下方式使用BufferedInputStream访问.zip文件的:
Url url = "http://somedomain.com/file.zip";
InputStream is = new BufferedInputStream(url.openStream(), 1024);

我的关注点在于这个应用程序是否会被用来传输非常大的 zip 文件,我想知道 BufferedInputStream 是否是最好的方法,还是我最终只会抛出某种类型的 OutOfMemoryException
因此,我的问题是:使用 BufferedInputStream 是否适合这个任务,或者我应该完全用不同的方式去做呢?

你可能想使用一个库来处理这个问题。文件上传是一种简单的DOS入口点。看看Apache Commons Fileupload中的FileUpload类。 - Perception
1
@Perception他上传到哪里了?他只是下载文件并解压缩。 - Viruzzo
@Viruzzo - 理解了。他所描述的过程听起来非常像文件上传,尽管在我的评论中使用“文件传输”可能更合适一些。 - Perception
@Perception 其实这根本不像上传:他不会接收文件内容(就像在POST/PUT上传中发生的那样),他只是获取文件并将其保存在本地。此外,在通常的HTTP服务器环境中,这部分将由服务器自动处理。 - Viruzzo
自动处理?由什么来处理?这就像文件上传一样,他从远程源接收到数据流并将其保存在本地。但正如我已经说过的那样,更准确地称呼这个过程是文件传输。 - Perception
3个回答

6

BufferedInputStream并不会将整个文件加载到内存中,它只使用一个内部缓冲区,在您的情况下大小为1024字节=1kb。它永远不会变得比那更大。如果您不会同时拥有很多流,则实际上可以增加该值。

编辑:您想要的可能是ByteArrayOutputStream,其中数据保存在内存中。


谢谢,你的回答和链接真的很有帮助。这个流应该是一次只运行一个,所以我会考虑增加大小。 - My Head Hurts
关于您的编辑,我认为您是正确的 - 当使用输入流时,我遇到了内存不足错误(因此我很担心),而且我认为我实际上是在使用ByteArrayOutputStream - My Head Hurts

1

这取决于你对读取的内容做什么。如果你将所有内容读入内存,它会失败。如果你将其写入另一个流,则会很好。使用 BufferedInputStream


将其保存在临时目录中,这样他就可以将其写入磁盘。 - Viruzzo

1

来自官方Java教程 - 缓冲流

Java平台实现了缓冲I/O流。缓冲输入流从称为缓冲区的内存区域读取数据;仅当缓冲区为空时才调用本机输入API。同样,缓冲输出流将数据写入缓冲区,并且仅在缓冲区满时才调用本机输出API。

还有一篇很棒的SUN文章

所以答案是:BufferedInputStream在性能方面适合这种工作。

是的,内存消耗并不太依赖于输入流的类型....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接