如何在写入文件时压缩它?

7

有没有办法在写入流时压缩数据流?我想避免将文件写入磁盘,只是想在将数据写入流时压缩它。

这背后的使用情况是原始文件非常大,我们希望避免将整个未压缩的文件写入磁盘。

4个回答

8
我认为你会对ZipOutputStream感兴趣。你可以向该流写入内容,然后将其写出到一个压缩文件中。
此外,请查看这个关于在Java中使用压缩(zipped)文件的教程。以下是来自该教程的代码片段,可能对你有所帮助:
     BufferedInputStream origin = null;
     FileOutputStream dest = new 
       FileOutputStream("c:\\zip\\myfigs.zip");
     ZipOutputStream out = new ZipOutputStream(new 
       BufferedOutputStream(dest));
     //out.setMethod(ZipOutputStream.DEFLATED);
     byte data[] = new byte[BUFFER];
     // get a list of files from current directory
     File f = new File(".");
     String files[] = f.list();

     for (int i=0; i<files.length; i++) {
        System.out.println("Adding: "+files[i]);
        FileInputStream fi = new 
          FileInputStream(files[i]);
        origin = new 
          BufferedInputStream(fi, BUFFER);
        ZipEntry entry = new ZipEntry(files[i]);
        out.putNextEntry(entry);
        int count;
        while((count = origin.read(data, 0, 
          BUFFER)) != -1) {
           out.write(data, 0, count);
        }
        origin.close();
     }
     out.close();

我看过这个例子,一开始觉得它不是我想要的。经过一番摸索,我终于明白了它的作用。对我来说唯一的区别是我不会真正地遍历任何文件。我只会在压缩文件中创建一个新条目,并将我当前正在写入文件的内容写入该条目。 - Andrei
@Andrei-- 是的,你的压缩文件里面没有必要包含多个文件。很高兴这能帮到你! - pkaeding

5

1

我之前在一个Web应用程序中做过这个。我获取了对servlet OutputStream的引用,然后将其提供给ZipOutputStream。然后我只是压缩了文件。压缩后的文件被提供给客户端浏览器。很简单。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接