1

私のマシンで次のファイル構造を圧縮しようとしていますが、

parent/
parent/test1
parent/test1/image1.jpeg
parent/test2

ここでの問題は、Java を使用して上記のファイル構造を圧縮できないことです。私はグーグルを持っていて、次のコードサンプルを見つけましたが、特定のフォルダー内でのみファイルを圧縮するだけです。

     File inFolder=new File("out");
     File outFolder=new File("Out.zip");
     ZipOutputStream out = new ZipOutputStream(new 
BufferedOutputStream(new FileOutputStream(outFolder)));
     BufferedInputStream in = null;
     byte[] data    = new byte[1000];
     String files[] = inFolder.list();
     for (int i=0; i<files.length; i++)
      {
      in = new BufferedInputStream(new FileInputStream
(inFolder.getPath() + "/" + files[i]), 1000);                  
out.putNextEntry(new ZipEntry(files[i])); 
      int count;
      while((count = in.read(data,0,1000)) != -1)
      {
           out.write(data, 0, count);
          }
      out.closeEntry();
      }
      out.flush();
      out.close();

上記のコードでは、 out はフォルダーであり、いくつかのファイルが必要です。また、フォルダーを空にすることはできません。その場合、例外 java.util.zip.ZipException がスローされるか、その中にファイルが含まれていてもサブフォルダーを含めることができません (例:out \newfolder\image.jpeg) その場合、java.io.FileNotFoundException: out\newfolder (アクセスが拒否されます) がスローされます。

私の場合、フォルダー構造に沿って空のフォルダーが存在する可能性があるデータベースにクエリを実行して、上記のファイル構造を構築します。

誰かが私に解決策を教えてもらえますか?

ありがとうございました。

4

2 に答える 2

3

おそらく起こっていることは、すべてのエントリをFileInputStream. ただし、ディレクトリの場合、これは当てはまりません。パスはファイルへのパスではないため、読み込もうとすると aFileNotFoundExceptionがスローされます。ディレクトリについては、引き続きZipEntry.

于 2010-11-07T08:11:40.647 に答える
2

2 つのメソッドを記述します。最初のものはdirpathを取り、zipストリームを作成し、ファイルをzipストリームにコピーし、以下のようにディレクトリに対して再帰的に呼び出す別のメソッドを呼び出します:

  1. 指定されたディレクトリの zip ストリーム内のエントリを開きます
  2. 指定されたディレクトリ内のファイルとディレクトリを一覧表示し、それらをループします
  3. エントリがファイルの場合、エントリを開き、ファイルの内容をエントリにコピーし、エントリを閉じます
  4. エントリがディレクトリの場合は、このメソッドを呼び出します。zip ストリームを渡す
  5. エントリを閉じます。

最初のメソッドは、zip ストリームを閉じます。

于 2010-11-07T10:15:06.610 に答える