繁体   English   中英

FileOutputStream与ByteArrayOutputStream

[英]FileOutputStream vs ByteArrayOutputStream

我正在读别人的代码。 这是它的要点。

类使用GZIPInputStream和GZIPOutputStream压缩和解压缩文件。

这是压缩过程中发生的事情的片段。 inputFileoutputFile是类File实例。

FileInputStream fis = new FileInputStream(inputFile);
GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputFile));

//the following function copies an input stream to an output stream
IOUtils.copy(fis,gzos);

//outputFile is the compressed file
...

现在,这是解压过程中发生的事情。

GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(inputFile));
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//copies input stream to output stream
IOUtils.copy(gzis,baos);

//this method does as its name suggests
FileUtils.writeByteArrayToFile(outputFile, baos.toByteArray());

//outputFile is the decompressed file
...

原始程序员在压缩期间选择FileOutputStream和解压缩期间ByteArrayOutputStream原因是什么? 这让我很困惑。

除非有充分的理由,否则我认为我正在改变它们,以避免将来混淆。 这是一个好主意吗?

嘿,听起来像他们复制和粘贴来自不同来源的代码? :-P不,严重的是,除非您需要检查解压缩的数据,否则您可以使用BufferedOutputStream进行压缩和解压缩。

ByteArrayOutputStream占用的内存更多,因为它将整个内容存储在Java的内存中(以byte[]风格)。 FileOutputStream直接写入磁盘,因此占用的内存较少。 在这种特殊情况下,我没有看到任何明智的理由使用ByteArrayOutputStream 之后不会修改单个字节。 之后它只会被写入文件。 因此,这是一个不必要的中间步骤。

程序员在压缩期间使用FileInputStream并在解压缩时使用缓冲区。 我认为原因是,如果你在读取文件失败,那么没有什么不好的事情发生。 你只是失败并抛出异常。

如果在解压缩时失败并且您已经开始写入文件,则文件已损坏。 所以他决定先写缓冲区,然后在解压缩完成后写入磁盘上的缓冲区。 如果您处理相对较小的文件,此解决方案是可以的。 否则这需要很多内存并且可能产生OutOfMemeoryError。

我将zip直接解压缩到临时文件,然后将临时文件重命名为其永久名称。 最后块应该关心删除临时文件。

ByteArrayOutputStream会给他/她一个不错的OutOfMemoryError吗?

说真的,他们可能在不同的时间完成。 如果可以,我会查阅VCS日志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM