2013-06-11 33 views
6

ディレクトリの内容を圧縮していますが、圧縮されたファイルを開くときにエラーが発生します。Javaユーティリティzipで「破損」zipファイルが作成される

私のコードで何が起こっているのか誰にでも教えてください。おそらく私は十分なバイトを割り当てていないでしょうか?

zipDirectory()を見ると、特別な拡張子ファイルを含むフォルダを圧縮していることがわかります。

どこにエラーが発生しているのかわからないので、誰かが私を助けてくれるかもしれません! IOとほとんどの問題と同様に

感謝

private void zipDirectory() { 

     File lazyDirectory = new File(defaultSaveLocation); 

     File[] files = lazyDirectory.listFiles(); 

     for (File file : files) { 

      if (file.isDirectory()) { 
      System.out.println("Zipping up " + file); 
      zipContents(file); 
      } 
     }  
    } 


public static void addToZip(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException { 

    System.out.println("Writing '" + fileName + "' to zip file"); 

    File file = new File(fileName); 
    FileInputStream fis = new FileInputStream(file); 
    ZipEntry zipEntry = new ZipEntry(fileName); 
    zos.putNextEntry(zipEntry); 

    byte[] bytes = new byte[1024]; 
    int length; 
    while ((length = fis.read(bytes)) >= 0) { 
     zos.write(bytes, 0, length); 
    } 

    zos.closeEntry(); 
    fis.close(); 

    } 

public static void zipContents(File dirToZip) { 

    List<File> fileList = new ArrayList<File>(); 

    File[] filesToZip = dirToZip.listFiles(); 

    for (File zipThis : filesToZip) { 

     String ext = ""; 

     int i = zipThis.toString().lastIndexOf('.'); 

     if (i > 0) { 
      ext = zipThis.toString().substring(i+1); 
     } 

     if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){ 
      fileList.add(zipThis); 
     } 

    } 


    try { 
     FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip"); 
     ZipOutputStream zos = new ZipOutputStream(fos); 

     for (File file : fileList) { 

      addToZip(file.toString(), zos); 

     } 

     } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
    } 

enter image description here

+2

最後にzos.close()を実行するべきではありませんか? – Piovezan

+1

私はこのことについても心配しています: 'file.toString()'。これは、そのパスを使ってzipファイルに "C:\ some \ dir \ some \ where \ file.ext"というファイルを追加することを示します。つまり、解凍すると、このEXACTの場所に解凍されます。元のトップレベルのパス(ルート親のトリム)に基づいて相対パスを構築してみることをお勧めします) – MadProgrammer

+0

これは標準のjava utilsで動作することは決してありませんでした。 Apache Commons Compressでドロップする(そしていくつかのアーカイブクロージャコールを追加する)ことは私のためにこれを解決しました。また、バッファリングされたリーダー/ライターで入出力ストリームをラップするようにしてください。 – Amalgovinus

答えて

14

Javaでストリームを、あなたのせいではあなたが適切にストリームを閉じていないことはほぼ確実です。あなたは、追加する必要があります:

zos.finish(); // good practice 
zos.close(); 

forループの後。

+0

あなたは 'flush'を意味するかもしれません。とにかく、私はPioevezanのコメントに投票します。 – SJuan76

+2

いいえ、私は '仕上げ'を意味します。 ZipOutputStreamの場合、finish()はflush()とは異なります。 – rolfl

+0

私は今、感謝を参照してください。 – SJuan76

0

私の修正は、あなたがzosを閉じるために、再度上記のことを行うその後EVERYファイルエントリにため

zos.finish() 
zos.flush() 
zos.closeEntry() 

これを行う必要があるということです。それ以外の場合は、デフォルトのウィンドウでzipフォルダを正しく開くことはできませんが、サードパーティのアプリケーションが動作します。

0

これあなたが解凍したファイルを作成するために、文字指向ライター(たとえばてFileWriter)を使用する場合にも発生する可能性があり(実際にはバイナリデータが含まれていること)

私が抽出し、への切り替えたファイルを読み取ることができませんでしたバイナリ出力ストリーム(FileOutputStream)で問題を修正しました

関連する問題