8

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

 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」はアーカイブ内にあったフォルダです。

追加するというダニエルの提案を試しました

unZippedFile.createNewFile();

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

それは別の例外を投げました:

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)
4

2 に答える 2

6

このコードを試してみてください。私のマシン (ubuntu) で動作します。

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();
       }
    }
于 2013-10-15T20:25:50.510 に答える
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。次の繰り返しで、同じ名前のディレクトリを作成しようとしましたが、おそらく黙って失敗し、その後の失敗の原因となりました。

于 2013-10-15T20:49:39.483 に答える