解压缩zip文件...文件未找到异常。

10

我从网络上获取了以下代码,看起来一切都正确,但是我收到了“文件未找到”的异常...

我在sdcard中有一个名为NewForestPonies.epub的文件

权限:

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

CODE: 代码
    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();
            }




    }

} 

错误:

    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)

请检查您是否在以下路径中有该文件:/mnt/sdcard/EPUB/META-INF/container.xml - Samir Mangroliya
@Samir 我只有一个压缩文件.. 我需要手动创建目标文件夹和文件吗?这是在代码中完成的,对吧? - vnshetty
你有写入SD卡的权限吗? - Jerome
你的错误日志提示你在正确路径上没有文件。请检查提供的文件路径是否正确,并检查该路径是否存在。同时,参考https://dev59.com/e2sz5IYBdhLWcg3wuKa7。 - Android
6个回答

4

我认为你代码中的问题在于你在第一个 while 循环中关闭了 ZipInputStream zin

使用以下代码替换 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();
...

0

检查以下函数的返回值:

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

如果返回了false,那么目录就不会被创建。这可能解释了为什么你在异常中得到了"(Not a directory)"。 mkdirs()的文档说明如下:

请注意,此方法在失败时不会抛出IOException。调用者必须检查返回值。

尝试像这样创建目录:
boolean result = (new File(_location, ze.getName())).getParentFile().mkdirs();

这样可以避免与'/'分隔符字符混淆。

0
 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

异常显示它不是一个目录,所以在你的代码中 -

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

我猜测您想要解压缩的ZIP文件位于/mnt/sdcard/EPUB/,但是在您的代码中,您试图访问该ZIP文件中可能驻留在META-INF/目录中的container.xml(我没有该文件,所以这里大多是猜测)。

所以您应该传递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


无法工作..我需要手动创建目标文件夹和文件吗?这是通过代码完成的,是吗? - vnshetty
@vnshetty 好的,在下载了一个随机的EPUB文件并运行代码后,我发现问题出在这里: fout = new FileOutputStream(_location + ze.getName()); 两个字符串之间没有插入分隔符,因此尽管正确的目录已创建,FileOutputStream仍会指示将文件写入不存在的目录中。尝试使用以下代码,它应该能够正常工作: file = new File(_location, ze.getName()); file.getParentFile().mkdirs(); fout = new FileOutputStream(file); 顺便说一句,最好使用 new File(String, String) 来构建文件路径。 - Kai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接