我在读别人的代码。这是它的要点。
类使用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,可能的原因是什么?这让我很困惑。
除非有很好的理由,否则我认为我会将它们更改为一致的,以避免将来的混乱。这是个好主意吗?
发布于 2011-01-04 02:12:21
嘿,听起来像是他们从不同的来源复制和粘贴代码?:-P不,说真的,除非你需要检查解压缩的数据,否则你可以只使用BufferedOutputStream进行压缩和解压。
发布于 2011-01-04 02:13:38
ByteArrayOutputStream占用更多的内存,因为它将整个内容存储在Java的内存中(以byte[]的形式)。FileOutputStream直接写入磁盘,因此占用的内存较少。在这种情况下,我看不出有任何合理的理由使用ByteArrayOutputStream。之后,它不会修改单个字节。它只是被不加修改地写到文件中。因此,这是一个不必要的中间步骤。
发布于 2011-01-04 02:17:27
程序员在压缩时使用FileInputStream,解压时使用buffer。我认为原因是如果你在读取文件的过程中失败了,没有什么不好的事情发生。你只是失败了,然后抛出一个异常。
如果解压缩失败,并且已经开始写入文件,则文件已损坏。因此,他决定先写buffer,然后在解压完成后在磁盘上写入buffer。如果您正在处理相对较小的文件,则可以使用此解决方案。否则,这需要大量的内存,并且可能会产生OutOfMemeoryError。
我会直接将zip解压到临时文件中,然后将临时文件重命名为其永久名称。最后,块应该注意删除临时文件。
https://stackoverflow.com/questions/4587003
复制相似问题