Java:解压缩文件,而不创建目标文件夹

时间:2011-03-02 11:26:54

标签: java android unzip

我有一个很好的java代码解压缩.zip文件。但是这段代码的问题是

  1. 我需要在运行此代码之前创建目标文件夹(注意:只有文件夹不是文件)。
  2. 否则我将获得路径未找到异常。
  3. 因此,如果之前不知道zip文件内容,则此代码将无法运行。所以我认为这是无用的代码。谁有更好的逻辑?还是需要编辑Bellow代码?

    package com.mireader;
    import android.os.Environment;
    import android.util.Log; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.util.zip.ZipEntry; 
    import java.util.zip.ZipInputStream; 
    
    /** 
     * 
     * @author jon 
     */ 
    public class Decompress { 
      private String _zipFile; 
      private String _location; 
    
        public Decompress(String zipFile, String location) { 
            _zipFile = zipFile; 
            _location = location; 
    
            _dirChecker(""); 
        } 
        public void unzip() { 
            try  { 
                FileInputStream fin = new FileInputStream(_zipFile); 
                ZipInputStream zin = new ZipInputStream(fin); 
                ZipEntry ze = null; 
                byte[] buffer = new byte[1024];
                int length;
                int i=0;  
                while ((ze = zin.getNextEntry()) != null) { 
                    Log.v("t", ze.toString());
                    Log.v("Decompress", "Unzipping " + ze.getName()); 
    
                    if(ze.isDirectory()) {
                        Log.i("my","Comes to if");
                        _dirChecker(ze.getName()); 
                    }
                    else { 
                        Log.i("my","Comes to else");
                        FileOutputStream fout = new FileOutputStream(_location + ze.getName()); 
                        while ((length = zin.read(buffer))>0) {
                            fout.write(buffer, 0, length);
                        }
                        zin.closeEntry(); 
                        fout.close(); 
                    } 
                }
                zin.close(); 
                Log.i("My tag","Success");
            }catch(Exception e) { 
                Log.e("Decompress", "unzip", e); 
            }     
    
        } 
    
        private void _dirChecker(String dir) { 
        File f = new File(_location + dir); 
        if(!f.isDirectory()) { 
            Log.i("mytag", "Creating new folder");
            f.mkdirs(); 
            System.out.print("stp:"+f.getName());
        } 
      } 
    } 
    

2 个答案:

答案 0 :(得分:2)

您可以避免使用以下代码

if(ze.isDirectory()) {
  Log.i("my","Comes to if");
  _dirChecker(ze.getName()); 
}

并在文件创建者其他部分添加类似下面的代码。它通过创建整个父文件夹为我工作。

File file = createFile((baseDirectory +"/" + zipFile.getName()));
file.getParentFile().mkdirs();

答案 1 :(得分:0)

看起来不错,你的问题究竟是什么? 您创建zip文件中显示的目录;我通常是内联的,但它是一样的。如果你的zip文件里面没有目录存根,那么你的代码就会失败(这可能发生在野外的zip创建者),所以我的解压缩代码在提取每个文件之前双重检查目录的存在:

if (zEntry.isDirectory()) new File(destDir+zEntry.getName()).mkdirs();
else 
{
String dstEntryDir=new File(destDir+zEntry.getName()).getParent()+File.separator;
if (!fileExists(dstEntryDir)) new File(dstEntryDir).mkdirs();
copyStreamToFile(zFile.getInputStream(zEntry),destDir+zEntry.getName());
}