我正在读别人的代码。这是它的要点。
一个类使用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
的原因是什么?这让我很困惑。
除非有充分的理由,否则我认为我正在改变它们,以避免将来混淆。这是个好主意吗?
答案 0 :(得分:11)
BufferedOutputStream
进行压缩和解压缩。
答案 1 :(得分:6)
ByteArrayOutputStream
占用的内存更多,因为它将整个内容存储在Java的内存中(以byte[]
的风格)。 FileOutputStream
直接写入磁盘,因此占用内存较少。在这种特殊情况下,我没有看到任何明智的理由使用ByteArrayOutputStream
。之后不会修改单个字节。之后它只会被写入文件。因此,这是一个不必要的中间步骤。
答案 2 :(得分:3)
程序员在压缩期间使用FileInputStream并在解压缩时使用缓冲区。我认为原因是,如果你在读取文件失败,那么没有什么不好的事情发生。你只是失败并抛出异常。
如果您在解压缩时失败并且您已经开始写入文件,则该文件已损坏。所以他决定先写缓冲区,然后在解压缩完成后写入磁盘上的缓冲区。如果您处理相对较小的文件,此解决方案是可以的。否则这需要很多内存并且可能产生OutOfMemeoryError。
我将zip直接解压缩到临时文件,然后将临时文件重命名为其永久名称。最后块应该关心删除临时文件。
答案 3 :(得分:1)
ByteArrayOutputStream
会给他/她一个不错的OutOfMemoryError
?
说真的,他们可能在不同的时间完成。如果可以,我会查阅VCS日志。