2012-03-22 46 views
3

Javaを使用してZIPファイルの圧縮を解除する際に問題が発生しました。この方法は以下の通りです。Java ZipFileクラスを使用したZIPファイルの圧縮解除

ファイルが圧縮解除されると、ファイル構造は正しいです。つまり、ディレクトリはZIPファイル内で正常ですが、出力ファイルの長さはゼロです。

ZIPファイルをチェックして、圧縮が正しいかどうか確認してください。

誰もが私が見逃している何か...

public static void unzip (File zipfile, File directory) throws IOException { 
    ZipFile zip = new ZipFile (zipfile); 
    Enumeration<? extends ZipEntry> entries = zip.entries(); 

    while (entries.hasMoreElements()) { 
    ZipEntry entry = entries.nextElement(); 
    File file = new File (directory, entry.getName()); 

    if (entry.isDirectory()) { 
     file.mkdirs(); 
    } 
    else { 
     file.getParentFile().mkdirs(); 

     ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 
     OutputStream out = new FileOutputStream (file); 
     byte[] buffer = new byte[4096]; 
     int readed = 0; 

     while ((readed = in.read (buffer)) > 0) { 
     out.write (buffer, 0, readed); 
     out.flush(); 
     } 

     out.close(); 
     in.close(); 
    } 
    } 

    zip.close(); 
} 

もっと何か...どうやら方法のgetInputStream(エントリー)はゼロバイトを返すを見れば、なぜ正確に知っているしないでください。

+0

デバッグを試しましたか? in.read()呼び出しがいくつかのバイトを返すかどうか? – leonbloy

+0

ループ内をフラッシュしないでください。 – EJP

答えて

2

はすでにエントリのデータを解凍していますので、ZipInputStreamも使用する必要はありません。

の代わりに:

ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 

用途:

InputStream in = zip.getInputStream (entry); 

ZipInputStreamが同様にZIPファイルを解凍するために使用することができます。 ZipInputStreamを使用すると、ZIPの最初のファイルを読み込むためにgetNextEntry()を呼び出す必要があるため、ゼロ長ストリームを取得する理由です。

+0

本当に問題でした...ありがとう、あなたは既に圧縮解除されたストリームを圧縮解除しようとしています。 –

-1

次のコードは動作します:

package so; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipInputStream; 

public class TestZip { 

    public static void main(String[] args) { 
     String path = "C:" + File.separator + "tmp" + File.separator; 
     String nom = "demo.zip"; 
     File zipfile = new File(path + nom); 
     File directory = new File(path); 
     TestZip m = new TestZip(); 
     try { 
      m.unzip(zipfile, directory); 
     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 
    } 

    public static void unzip (File zipfile, File directory) throws IOException { 
     System.out.println(zipfile.toString()); 
     System.out.println(directory.toString()); 
      ZipFile zip = new ZipFile ( zipfile); 
      System.out.println("1"); 
      Enumeration<? extends ZipEntry> entries = zip.entries(); 
      System.out.println("2"); 

      while (entries.hasMoreElements()) { 
       System.out.println("3"); 
      ZipEntry entry = entries.nextElement(); 
      File file = new File (directory, entry.getName()); 

      if (entry.isDirectory()) { 
       file.mkdirs(); 
      } 
      else { 
       file.getParentFile().mkdirs(); 

       ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 
       OutputStream out = new FileOutputStream (file); 
       byte[] buffer = new byte[4096]; 
       int readed = 0; 

       while ((readed = in.read (buffer)) > 0) { 
       out.write (buffer, 0, readed); 
       out.flush(); 
       } 

       out.close(); 
       in.close(); 
      } 
      } 

      zip.close(); 
     } 


} 

だから私はこの問題は、あなたが渡しているパラメータであると思います。引数 "zipfile"を "new File(complete_path + filename)"で作成します。ファイル名で作成するだけでは機能しません。

関連する問題