2016-11-15 9 views
0

私はzip拡張子で圧縮ファイルを受け取りました。 Windowsエクスプローラを使用して直接開くことはできません。 私は7Zipを使用してそれを抽出することができますが、それは何らかのエラーを投げますが、ファイルはまだ期待どおりに圧縮解除されます。 私はwinrarを使用してそれを抽出できます。エラーはありません。ファイルは期待どおりに圧縮解除されています。空のフォルダjava.util.zip/zip4jを使用して解凍しようとしたとき

私はjava.util.unzip/zip4jを使って解凍しようとしました。

java.util.zipコード:上記のコードで

public static void unzip(String zipFilePath, 
         String destDirectory) throws IOException { 
    File destDir = new File(destDirectory); 
    if (!destDir.exists()) { 
     destDir.mkdir(); 
    } 
    ZipInputStream zipIn = 
     new ZipInputStream(new FileInputStream(zipFilePath)); 
    ZipEntry entry = zipIn.getNextEntry(); 
    // iterates over entries in the zip file 
    while (entry != null) { 
     String filePath = destDirectory + File.separator + entry.getName(); 
     if (!entry.isDirectory()) { 
      // if the entry is a file, extracts it 
      extractFile(zipIn, filePath); 
     } else { 
      // if the entry is a directory, make the directory 
      File dir = new File(filePath); 
      dir.mkdir(); 
     } 
     zipIn.closeEntry(); 
     entry = zipIn.getNextEntry(); 
    } 
    zipIn.close(); 
} 

/** 
* Extracts a zip entry (file entry) 
* @param zipIn 
* @param filePath 
* @throws IOException 
*/ 
private static void extractFile(ZipInputStream zipIn, 
           String filePath) throws IOException { 
    BufferedOutputStream bos = 
     new BufferedOutputStream(new FileOutputStream(filePath)); 
    byte[] bytesIn = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = zipIn.read(bytesIn)) != -1) { 
     bos.write(bytesIn, 0, read); 
    } 
    bos.close(); 
} 

、エラーは発生しません、しかし、私は空のフォルダを取得します。

zip4jコード:

 String zipFilePath = "C:\\Juw\\JR\\file\\output\\020030214112016.zip"; 
    //String zipFilePath = "C:\\Juw\\JR\\file\\output\\myFile.zip"; 
    String destDirectory = "C:\\Juw\\JR\\file\\output\\targetUnzip"; 

    try { 
     ZipFile zipFile = new ZipFile(zipFilePath); 
     zipFile.extractAll(destDirectory); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

と例外があります: net.lingala.zip4j.exception.ZipException:見つからないヘッダをジップが。おそらくzipファイルではない

もし私がwinrarを使ってファイルを解凍しようとしたら、私はzip機能で構築されたウィンドウを使って圧縮しました。私はコードを使用してそれを解凍することができます。私の人とクライアントの間でサイズが違う。私のものは508kbで、もう一つは649kbです。

質問は: - 強力なWinrarを利用するJavaライブラリはありますか?圧縮ファイルをエラーなく抽出できますか? - このケースを解決するためのベストプラクティスは何ですか?

多くのありがとうございました:)

+3

"このケースを解決するためのベストプラクティスは何ですか?" - クライアントに有効な.zipファイルを提供するよう依頼します。 – JimmyB

+0

こんにちはJimmyB、zipファイルが有効ではないと思われますか? Winrarは問題なく抽出することができるからです。それはクライアントが別の標準的なジップを持つサードパーティ製のアプリケーションを使用してそれを圧縮する可能性はありますか?または他のOS(ウィンドウではない)からですか? – cumibulat

+0

Windowsと7zipとJava libが失敗したりエラーが報告された場合、ファイルが何らかの形で完全に有効でない可能性があると私は考えています。たぶんzipファイルではないかもしれませんが、.zipという名前のファイルに書かれた別のフォーマットかもしれません。ファイル名に依存せずにファイルが実際にどのようなものかを判断するツールは、それをまだ解凍できるかもしれません。 – JimmyB

答えて

0

私を助けてくれたすべての回答に感謝します。

このgzipファイル(.zip拡張子)は、ファイルの最後に空の文字列があります。以前の投稿で言及したように、それはエラーを投げた。以下のコードで、私は同僚から得て、問題は解決されています。他のユーザーが将来それを使うことができるように投稿します。

public void gunzipIt(){ 

byte[] buffer = new byte[1024]; 
boolean isValid = true; 

try{ 

    GZIPInputStream gzis = 
     new GZIPInputStream(new FileInputStream(INPUT_GZIP_FILE)); 

    FileOutputStream out = 
     new FileOutputStream(OUTPUT_FILE); 

    while (isValid) { 

     int len; 

     try{ 
      len = gzis.read(buffer); 
     }catch(Exception ex){ 
      len = 0; 
      isValid = false; 
     } 

     if (len > 0) { 
      out.write(buffer, 0, len); 
     }else{ 

      isValid = false; 
     } 
    } 

    gzis.close(); 
    out.close(); 

    System.out.println("Done"); 

}catch(IOException ex){ 
    ex.printStackTrace(); 
} 

}

関連する問題