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
- ¿Por qué usamos la palabra clave "new" con una Interfaz en Java?
- Cómo configurar un spinner onClickListener () en Android
- Principiante Desarrollador: Desconocido Error: java.lang.nullPointerException
- Obtener el nombre del método actual que se está ejecutando
- Android AudioInputStream
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)
- Subíndice y superíndice una cadena en Android
- Patrón de diseño para acceder a los mismos datos de diferentes fuentes
- Aplicación de Android, El marcado en el documento que sigue al elemento raíz debe estar bien formado
- Java: Necesita alguna manera de acortar este código
- Imposible crear archivo en almacenamiento externo Android
- Cómo ver una matriz en logcat para android
- Mejorando la velocidad de getpixel () y setpixel () en Android Bitmap
- Inicializando la conexión bluetooth android (cliente) a python (servidor) en pc
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(); }
- Tesseract caligrafía con formación de diccionario
- Navigator.geolocation.getCurrentPosition siempre obtiene un código de error 3: timeout expirado