Распаковка zip файла... Исключение файла не найдено

У меня есть следующий код из сети, и все выглядит правильно, но я получаю исключение File not found...

У меня есть файл с именем NewForestPonies.epub в sdcard

Разрешение:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

КОД:

    String ZipFileLocation=Environment.getExternalStorageDirectory()+"/NewForestPonies.epub";
    String unZipFileLocation=Environment.getExternalStorageDirectory()+"/DEST/";
    Decompress decomp=new Decompress(ZipFileLocation, unZipFileLocation, "zip");
    decomp.run(); 



 public Decompress(String zipFile, String location,String t) { 
    super(t);
    _zipFile = zipFile; 
    _location = location; 
} 
public void run() {
    FileInputStream fin=null;
    ZipInputStream zin=null;
    File file =null; 
    ZipEntry ze ;
    FileOutputStream fout=null;
    try{ 
        System.out.println(_zipFile );
        System.out.println(_location);
        fin = new FileInputStream(_zipFile); 
        zin = new ZipInputStream(fin); 
        ze= null; 
        byte[] buffer = new byte[1024];
        int length;
        while ((ze = zin.getNextEntry()) != null) { 
            file = new File((_location +"/" + ze.getName()));
            file.getParentFile().mkdirs();
             fout= new FileOutputStream(_location + ze.getName()); 
            while ((length = zin.read(buffer))>0) {
                fout.write(buffer, 0, length);
            }
            zin.closeEntry(); 
            fout.close();        
        }
        //MyDownloadListener.progress=70;
        zin.close();   
    }catch(Exception e) { 
        Log.e("Decompress", "unzip", e); 
    }  
    finally {

            try {
                fin.close();
                zin.close();
                fout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }




    }

} 

ERRROR:

    03-20 15:49:15.909: ERROR/Decompress(9479): java.io.FileNotFoundException: /mnt/sdcard/DEST/NewForestPonies/iTunesMetadata.plist (Not a directory)
03-20 15:49:15.909: ERROR/Decompress(9479):     at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
03-20 15:49:15.909: ERROR/Decompress(9479):     at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:239)
03-20 15:49:15.909: ERROR/Decompress(9479):     at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
03-20 15:49:15.909: ERROR/Decompress(9479):     at java.io.FileOutputStream.<init>(FileOutputStream.java:77)
03-20 15:49:15.909: ERROR/Decompress(9479):     at com.AndroidExplorer.Decompress.run(Decompress.java:42)
03-20 15:49:15.909: ERROR/Decompress(9479):     at com.AndroidExplorer.DecompressActivity.onCreate(DecompressActivity.java:23)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.app.ActivityThread.access$1500(ActivityThread.java:122)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.os.Looper.loop(Looper.java:132)
03-20 15:49:15.909: ERROR/Decompress(9479):     at android.app.ActivityThread.main(ActivityThread.java:4028)
03-20 15:49:15.909: ERROR/Decompress(9479):     at java.lang.reflect.Method.invokeNative(Native Method)
03-20 15:49:15.909: ERROR/Decompress(9479):     at java.lang.reflect.Method.invoke(Method.java:491)
03-20 15:49:15.909: ERROR/Decompress(9479):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
03-20 15:49:15.909: ERROR/Decompress(9479):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
03-20 15:49:15.909: ERROR/Decompress(9479):     at dalvik.system.NativeStart.main(Native Method)

Ответ 1

Я думаю, что проблема в вашем коде заключается в закрытии ZipInputStream zin в первом цикле while.

Используйте код ниже для run(), это может вам помочь.

public void run() {
    BufferedOutputStream bufferedOutputStream = null;
    FileInputStream fileInputStream;

    File dest_file = new File(_location);
    dest_file.mkdirs(); // creates if destination directory not existed    

    try {
        fileInputStream = new FileInputStream(_zipFile);
        ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(fileInputStream));
        ZipEntry zipEntry;

        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
            String zipEntryName = zipEntry.getName();
            File file = new File(_location + zipEntryName);

            if (file.exists()) {

            } else if (zipEntry.isDirectory()) {
                file.mkdirs();
            } else {
                byte buffer[] = new byte[1024];
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                bufferedOutputStream = new BufferedOutputStream(fileOutputStream, 1024);
                int count;

                while ((count = zipInputStream.read(buffer, 0, 1024)) != -1) {
                    bufferedOutputStream.write(buffer, 0, count);
                }
                bufferedOutputStream.flush();
                bufferedOutputStream.close();
            }
        }
        zipInputStream.close();
    } catch (Exception e) {
        Log.e("Decompress", "unzip", e);
    }
}

Ответ 2

Не могли бы вы сначала создать новый файл?

file = new File((_location +"/" + ze.getName()));
file.getParentFile().mkdirs();
if (!file.isFile())
    file.createNewFile();
...

Ответ 3

Я предполагаю, что ZIP файл, который вы хотите распаковать, находится в /mnt/sdcard/EPUB/, но в вашем коде вы пытаетесь получить доступ к контейнеру .xml, который, вероятно, находится в каталоге META-INF/ZIP файл (у меня нет файла, поэтому он в основном угадывает здесь).

Итак, что вам нужно сделать, это передать местоположение ZIP файла (например,/mnt/sdcard/EPUB/book1.epub), например:

Decompress("/mnt/sdcard/EPUB/book1.epub", "/mnt/sdcard/EPUB",t) 

После этого вы можете открыть несжатый container.xml свой собственный код в/mnt/sdcard/EPUB/META-INF/container.xml

Ответ 4

Проверьте возвращаемое значение:

boolean result = file.getParentFile().mkdirs();

Если он вернул false, каталоги не были бы созданы. Это может объяснить, почему вы получаете "(не каталог)" в исключении.

Документация mkdirs() говорит:

Обратите внимание, что этот метод не бросает IOException при сбое. Вызывающие должен проверить возвращаемое значение.

Попробуйте создать такие каталоги:

boolean result = (new File(_location, ze.getName())).getParentFile().mkdirs();

Это позволяет избежать возиться с символами разделителя '/'.

Ответ 5

 while ((ze = zin.getNextEntry()) != null) { 
        if (ze.isDirectory()) {
          file = new File((_location, ze.getName()));
          if (!file.exists())
             file.mkdirs();
          continue;
        }
        file = new File((_location +"/" + ze.getName()));
    //   file.getParentFile().mkdirs();
         fout= new FileOutputStream(_location + ze.getName()); 
        while ((length = zin.read(buffer))>0) {
            fout.write(buffer, 0, length);
        }
        zin.closeEntry(); 
        fout.close();        
    }

Ответ 6

Exception показывает его не каталог, поэтому в вашем коде -

while ((ze = zin.getNextEntry()) != null) { 
            file = new File((_location +"/" + ze.getName()));
**if(file.isDirectory())**
            file.getParentFile().mkdirs();
             fout= new FileOutputStream(_location + ze.getName()); 
            while ((length = zin.read(buffer))>0) {
                fout.write(buffer, 0, length);
            }
            zin.closeEntry(); 
            fout.close();        
        }