распаковка zip-файла ... исключение не найдено - PullRequest
10 голосов
/ 13 марта 2012

Я получил следующий код из сети, и, похоже, все в порядке, но я получаю исключение Файл не найден ...

У меня есть файл с именем 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)

Ответы [ 6 ]

4 голосов
/ 26 марта 2012

Я думаю, что проблема в вашем коде в том, что вы закрываете ZipInputStream zin в 1-м цикле 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 голосов
/ 20 марта 2012

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

file = new File((_location +"/" + ze.getName()));
file.getParentFile().mkdirs();
if (!file.isFile())
    file.createNewFile();
...
0 голосов
/ 27 марта 2012

Исключение показывает, что это не каталог, поэтому в вашем коде -

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();        
        }
0 голосов
/ 22 марта 2012
 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();        
    }
0 голосов
/ 20 марта 2012

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

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

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

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

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

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

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

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

0 голосов
/ 13 марта 2012

Я предполагаю, что ZIP-файл, который вы хотите распаковать, находится в / mnt / sdcard / EPUB /, но в вашем коде вы пытаетесь получить доступ к container.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

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...