![](/img/trans.png)
[英]Write ByteArrayOutputStream to FileOutputStream vs Write ByteArray to FileOutputStream?
[英]FileOutputStream vs ByteArrayOutputStream
我正在读别人的代码。 这是它的要点。
类使用GZIPInputStream和GZIPOutputStream压缩和解压缩文件。
这是压缩过程中发生的事情的片段。 inputFile
和outputFile
是类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.