2010-11-29 21 views
7

あなたが書いているストリームを解凍する方法を知っている人はいますか?私はディスクにファイルを書き込むことを避けようとしており、ストリームに書き込むときにデータを圧縮できるかどうか疑問に思っていました。ファイルへの書き込み中にファイルを圧縮する方法は?

これの背後にあるユースケースは、rawファイルが非常に大きくなり、解凍されたもの全体をディスクに書き込まなくてもいいということです。

答えて

8

ZipOutputStreamに興味があると思います。あなたはそのストリームに書き込み、それをzipファイルに書き出すことができます。

working with compressed (zipped) files in Javaのチュートリアルもご覧ください。このチュートリアルのスニペットを参考にしてください:

 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(); 
+0

私はこの例を見てきた、そしてそれは私が探していたものだったとは思いませんでした。ちょっとびっくりした後、ついにそれが何をするのか理解しています。違いは、私が実際にファイルを繰り返し実行しないということだけです。私はちょうどzipファイルに新しいエントリを作成し、私は現在このエントリにファイルに書いているものを書きます。 – Andrei

+0

@ Andrei--ええ、あなたのzipファイルに複数のファイルが含まれている必要はありません。これはうれしい! – pkaeding

1

私はこれをウェブアプリケーションでこれまでに行っています。サーブレットのOutputStreamへの参照を取得し、それをZipOutputStreamに提供しました。それから私はちょうど圧縮した。圧縮されたファイルは、クライアントブラウザまで提供されました。簡単です。これは、一般的にフィルタを使用してWebアプリケーションのために行われる

関連する問題