2013-10-15 8 views
8

アーカイブ内のファイルとフォルダを含むjavaでアーカイブを解凍しようとしています。問題は、フォルダに移動して解凍しようとするたびにFNF例外がスローされることです。次のように私の解凍のコードは次のとおりです。フォルダを含むJava unzip圧縮アーカイブFileNotFound例外

private void unZipUpdate(String pathToUpdateZip, String destinationPath){ 
     byte[] byteBuffer = new byte[1024]; 

     try{ 
      ZipInputStream inZip = new ZipInputStream(new FileInputStream(pathToUpdateZip)); 
      ZipEntry inZipEntry = inZip.getNextEntry(); 
      while(inZipEntry != null){ 
       String fileName = inZipEntry.getName(); 
       File unZippedFile = new File(destinationPath + File.separator + fileName); 


       System.out.println("Unzipping: " + unZippedFile.getAbsoluteFile()); 
       new File(unZippedFile.getParent()).mkdirs(); 


       FileOutputStream unZippedFileOutputStream = new FileOutputStream(unZippedFile); 
       int length; 
       while((length = inZip.read(byteBuffer)) > 0){ 
        unZippedFileOutputStream.write(byteBuffer,0,length); 
       } 
       unZippedFileOutputStream.close(); 
       inZipEntry = inZip.getNextEntry(); 
      } 
      inZipEntry.clone(); 
      inZip.close(); 
      System.out.println("Finished Unzipping"); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

私は

new File(unZippedFile.getParent()).mkdirs(); 

で扱う圧縮フォルダを持っていたしかし、それは問題を解決していないようだと思いました。私はここで何が欠けていますか?

スタックトレース:

Unzipping: D:\UnzipTest\aspell 
java.io.FileNotFoundException: D:\UnzipTest\aspell\american-w-accents.alias (The system cannot find the path specified) 
    at java.io.FileOutputStream.open(Native Method) 
Unzipping: D:\UnzipTest\aspell\american-w-accents.alias 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171) 
    at shopupdater.ShopUpdater.unZipUpdate(ShopUpdater.java:47) 
    at shopupdater.ShopUpdater.unZipUpdate(ShopUpdater.java:33) 
    at shopupdater.ShopUpdater.main(ShopUpdater.java:67) 

"のaspellは、" アーカイブの中にあったフォルダです。

私は別の例外投げ

new File(UnzippedFile.getParent()).mkdirs(); 

unZippedFile.createNewFile(); 

を追加するダニエルの提案を試みた:Ubuntuの(それは私のマシン上で動作しますが、このコードを試してみてください

Unzipping: D:\UnzipTest\aspell 
Unzipping: D:\UnzipTest\aspell\american-w-accents.alias 
java.io.FileNotFoundException: D:\UnzipTest\aspell\american-w-accents.alias (The system cannot find the path specified) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171) 
    at shopupdater.ShopUpdater.unZipUpdate(ShopUpdater.java:56) 
    at shopupdater.ShopUpdater.unZipUpdate(ShopUpdater.java:33) 
    at shopupdater.ShopUpdater.main(ShopUpdater.java:76) 
+0

スタックトレースを送信してください。 –

+0

@SotiriosDelimanolisが元の投稿に追加されました – user1806716

+1

もしあなたが(inZipEntry.isDirectory())かどうかをチェックしていないからです。ディレクトリの場合、バイトを書き込むのではなく作成してください。 – tom

答えて

5

を)

private static void unZipUpdate(String pathToUpdateZip, String destinationPath){ 
     byte[] byteBuffer = new byte[1024]; 

     try{ 
      ZipInputStream inZip = new ZipInputStream(new FileInputStream(pathToUpdateZip)); 
      ZipEntry inZipEntry = inZip.getNextEntry(); 
      while(inZipEntry != null){ 
       String fileName = inZipEntry.getName(); 
       File unZippedFile = new File(destinationPath + File.separator + fileName); 
       System.out.println("Unzipping: " + unZippedFile.getAbsoluteFile()); 
       if (inZipEntry.isDirectory()){ 
        unZippedFile.mkdirs(); 
       }else{ 
        new File(unZippedFile.getParent()).mkdirs(); 
        unZippedFile.createNewFile(); 
        FileOutputStream unZippedFileOutputStream = new FileOutputStream(unZippedFile); 
        int length; 
        while((length = inZip.read(byteBuffer)) > 0){ 
         unZippedFileOutputStream.write(byteBuffer,0,length); 
        } 
        unZippedFileOutputStream.close();      
       } 
       inZipEntry = inZip.getNextEntry(); 
      } 
      //inZipEntry.close(); 
      inZip.close(); 
      System.out.println("Finished Unzipping"); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 
+0

それはどこにあるべきですか?ファイル出力ストリームの初期化の前に? – user1806716

+0

私の回答が更新されました – Daniel

+0

私は更新されたファイルとディレクトリをどうにか混乱させました。 Windowsマシンでも同じように動作することを願っています。 – Daniel

1

ディレクトリをファイルとして最初に処理していて、ディレクトリの作成を妨げる空のファイルを作成しているようです。

Unzipping: D:\UnzipTest\aspell 
Unzipping: D:\UnzipTest\aspell\american-w-accents.alias 
java.io.FileNotFoundException: D:\UnzipTest\aspell\american-w-accents.alias 

完全にはわかりにくいですが、そのように見えます。最初の "Unzipping:"行は、コードがD:\UnzipTest\aspellという名前の空のファイルを作成したときです。次の繰り返しで、同じ名前のディレクトリを作成しようとしましたが、おそらくサイレントに失敗し、後で失敗しました。

関連する問題