解压缩文件的格式不正确

时间:2014-04-22 07:25:55

标签: java unzip zipinputstream

我想解压缩所有文件夹和不同类型的文件,如.xls,.apk,.png等。但提取所有文件时,他们都是新提取的文件夹(或该文件夹下的文件夹)。但那些.xml,.png,.apk文件的格式不正确。当我打开时,xls文件显示弹出的格式可能不同,并且当它打开文件时所有内容都是不同的格式。 .png文件也无法打开,提取后.apk也没有用。为什么会这样? **

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipFiles {

    public static void main(String a[]){

        UnzipFiles mfe = new UnzipFiles();
        mfe.unzipFile("E:/New folder/pics.zip");
    }
    public void unzipFile(String filePath){

        FileInputStream fis = null;
        ZipInputStream zipIs = null;
        ZipEntry zEntry = null;
        try {
            fis = new FileInputStream(filePath);
            zipIs = new ZipInputStream(new BufferedInputStream(fis));
            while((zEntry = zipIs.getNextEntry()) != null){
                try{
                    byte[] tmp = new byte[25*1024*1024];
                    FileOutputStream fos = null;
                    /*String opFilePath = "E:/New folder/new/"+zEntry.getName();*/
                   String opFilePath= "E:/New folder/new"+File.separator+zEntry.getName();
                    File f = new File(  opFilePath); 
                    if(zEntry.isDirectory())
                    { f.mkdirs();
                    System.out.println(f.getName()+"   "+"folder created");
                    }

                    else{
                    System.out.println(f.getName());
                    /*System.out.println("Extracting file to "+opFilePath);*/
                    fos = new FileOutputStream(f);
                    BufferedOutputStream out =  new BufferedOutputStream(fos);

                    int size = 0;
                    int k= zipIs.read(tmp);
                    System.out.println(k+1);
                    while((size = zipIs.read(tmp)) != -1){
                        out.write(tmp, 0 , size);

                    }

                    }

                } catch(Exception ex){
                    ex.printStackTrace();
                }

            }
            zipIs.closeEntry();
            zipIs.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException exc) {
            // TODO Auto-generated catch block
            exc.printStackTrace();
        }
    }


}

**

1 个答案:

答案 0 :(得分:2)

您忘记将您读取的第一个字节放入目标文件中:

                int k= zipIs.read(tmp); // <--- HERE
                System.out.println(k+1);
                while((size = zipIs.read(tmp)) != -1){
                    out.write(tmp, 0 , size);

此外,如果您使用Java 7,请使用ZIP FileSystem以及Files.walkFileTree();这将使你的工作更多更简单!