Java FileOutputStream与ByteArrayOutputStream

Java FileOutputStream与ByteArrayOutputStream,java,file,stream,Java,File,Stream,我在读别人的密码。以下是要点 类使用GZIPInputStream和GZIPOutputStream压缩和解压缩文件 下面是压缩过程中发生的一个片段inputFile和outputFile是类File的实例 FileInputStream fis = new FileInputStream(inputFile); GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputFile)); //the follo

我在读别人的密码。以下是要点

类使用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不,说真的,除非您需要检查解压缩的数据,否则您可以使用
缓冲输出流
进行压缩和解压缩。

通过tearrayoutputstream
将给他/她一个很好的
OutOfMemoryError

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
...

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

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

程序员在压缩时使用FileInputStream,在解压缩时使用buffer。我认为原因是如果你读文件失败了,没有什么不好的事情发生。您只是失败了,然后抛出一个异常

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


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

IOUtils和FileUtils是专有的还是来自像commons-io这样的库?@sblundy,它们来自像commons-io这样的库。在这种情况下,您建议我使用
new BufferedOutputStream(new FileOutputStream(outputFile)
而不是
new FileOutputStream(outputFile)吗
?会有性能提升吗?我会,当真正的解决方案是使用BufferedInputStream和BufferedOutputStream时,这似乎可以提高性能。是的。BufferedInput和BufferedOutput是有效的方法。@Russell:的确,是的,在这两个地方都使用缓冲流。(并不是说我需要这么说,因为另外两个已经这么说了,只是为了结束你的问题。:-)P.S.考虑将输入流封装在<代码> BuffReDeDePixStudio中,再次压缩和解压缩。好的想法。似乎代码中没有地方来处理失败的写,所以我猜在这个特定的情况下,它是复制粘贴或在不同的时间写的。