0

我想解压缩所有文件夹和不同类型的文件,如 .xls、.apk、.png 等。但是在提取所有文件时,它们都在新提取的 foder 中(或该文件夹下的文件夹)。但那些 .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();
        }
    }


}

**

4

1 回答 1

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,请使用 ZIPFileSystem以及Files.walkFileTree(); 这将使您的工作变得更加简单!

于 2014-04-22T07:27:58.250 回答