FileOutputStream与ByteArrayOutputStream

时间:2011-01-03 18:09:16

标签: java file stream

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

一个类使用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的原因是什么?这让我很困惑。

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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

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

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