Descomprimir un archivo zip … Archivo no encontrado excepción

Tengo el siguiente código de red y parece que todo es correcto, pero estoy recibiendo una excepción de archivo no encontrado …

Tengo un archivo llamado NewForestPonies.epub en sdcard

Permiso:

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

CÓDIGO:

  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(); } } } 

ERROR:

  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) 

Creo que el problema en su código es que usted está cerrando zin ZipInputStream en 1 º mientras que el bucle.

Utilice debajo del código para run () , puede ayudarle.

 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); } } 

¿Podría intentar crear primero un archivo nuevo?

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

Supongo que el archivo ZIP que desea descomprimir se encuentra en / mnt / sdcard / EPUB /, pero en su código está intentando acceder al container.xml que probablemente reside en el directorio META-INF / del archivo ZIP ( No tengo el archivo, por lo que es la mayoría adivinar aquí).

Así que lo que debe hacer es pasar la ubicación del archivo ZIP (por ejemplo, /mnt/sdcard/EPUB/book1.epub), como esto:

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

Después de lo cual puede abrir el container.xml descomprimido con su propio código en /mnt/sdcard/EPUB/META-INF/container.xml

Compruebe el valor devuelto de:

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

Si se devuelve false los directorios no se habrían creado. Esto podría explicar por qué obtiene " (No un directorio) " en la excepción.

La documentación de mkdirs () dice:

Tenga en cuenta que este método no ejecuta IOException en caso de error. Los llamantes deben comprobar el valor devuelto.

Intente crear los directorios como este:

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

Esto evita jugar con los caracteres de separación '/'.

  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(); } 

Excepción muestra que no es un directorio, por lo que en su código-

 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(); } 
  • Agregar fragmento a la actividad de NavigationDrawer
  • Optimización de la aplicación de Android antes del lanzamiento
  • Permisos múltiples de Android 6.0
  • Generar y reproducir sonido dinámicamente (a partir de datos de frecuencia / amplitud)
  • Android: cambia el orden z de la vista
  • La respuesta HTTPUrlConnection de Android devuelve la basura
  • ¿Cómo puedo inyectar un objeto en Android Priority Job Queue con Dagger 2?
  • Nombre de la unidad organizativa
  • Deserialización de Gson de List <String> en realmList <RealmString>
  • Android: Will finish () SIEMPRE llama a onDestroy ()?
  • Mensaje de Android a Android sin Accesspoint
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.