java中不能解压压缩包下面的文件夹

如果压缩包下有文件夹的话,就直接出错了,文件的话就解压成功... 如果压缩包下有文件夹的话,就直接出错了,文件的话就解压成功 展开
 我来答
如此匆忙
2014-06-09 · TA获得超过134个赞
知道小有建树答主
回答量:208
采纳率:0%
帮助的人:163万
展开全部

Java原生解压缩API是无法操作中文的,你的问题在于没有判断是否是目录或者文件,如果你把目录当成文件写到磁盘,肯定不对

package org.xdemo.superutil;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * 文件解压缩
 * @author <a href="

 * 252878950@qq.com
 */
public class ZipUtils {
/**
 * 文件解压缩 注意 不能有中文文件名
 * @param zipSrc zip文件路径
 * @param dest 解压的路径,无需以“\\”或者“/”结尾
 * @throws IOException
 */
public static void unzip(String zipSrc,String dest) throws IOException{

//为了适配不同操作系统的文件路径的分隔符
String systemSeparator=System.getProperty("file.separator");
System.out.println(systemSeparator);

CheckedInputStream cis=new CheckedInputStream(new FileInputStream(new File(zipSrc)), new CRC32());
ZipInputStream zis=new ZipInputStream(cis);
ZipEntry ze=null;
FileOutputStream fos=null;
byte[] buffer=new byte[1024];
int length=0;

if(!new File(dest).exists())new File(dest).mkdirs();

while((ze=zis.getNextEntry())!=null){
String fileName=dest+File.separator+ze.getName();
//都替换一遍省心
fileName=fileName.replace("\\", systemSeparator).replace("/", systemSeparator);
if(fileName.lastIndexOf(systemSeparator)!=-1)new File(fileName.substring(0,fileName.lastIndexOf(systemSeparator))).mkdirs();
if(fileName.lastIndexOf(systemSeparator)==fileName.length()-1)continue;
System.out.println(fileName);
fos=new FileOutputStream(fileName);
while ((length=zis.read(buffer))!=-1) {
fos.write(buffer, 0, length);
}
fos.close();
}
zis.closeEntry();
zis.close();
}


}
更多追问追答
追问
ZipEntry ze = zis.getNextEntry();获取为空
追答

你写的明显不对,直接zis.getNextEntry()只能解压出一个文件或者目录,而且你没判断是文件还是目录,所以这里也不对,明白了吗?需要遍历的方法去解压,而且你取到最后的话,肯定是null啊,null 的时候说明就解压结束了

ZipEntry ze=null;
while((ze=zis.getNextEntry())!=null){
            String fileName=dest+File.separator+ze.getName();
            //都替换一遍省心
            fileName=fileName.replace("\\", systemSeparator).replace("/", systemSeparator);
            if(fileName.lastIndexOf(systemSeparator)!=-1)new File(fileName.substring(0,fileName.lastIndexOf(systemSeparator))).mkdirs();
            if(fileName.lastIndexOf(systemSeparator)==fileName.length()-1)continue;
            System.out.println(fileName);
            fos=new FileOutputStream(fileName);
            while ((length=zis.read(buffer))!=-1) {
                fos.write(buffer, 0, length);
            }
            fos.close();
        }

 没有问题请采纳哦,如果有中文,请采用apache 的zip工具类,另外在解压之前应该校验CRC32

cucaracha
2014-06-09 · 超过54用户采纳过TA的回答
知道小有建树答主
回答量:95
采纳率:100%
帮助的人:77.9万
展开全部

试试看这个:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
 
public class UnZipExample {
 
    List<String> fileList;
    private static final String INPUT_ZIP_FILE = "C:\\MyFile.zip";
    private static final String OUTPUT_FOLDER = "C:\\outputzip";
 
    public static void main(String[] args) {
        UnZipExample unZip = new UnZipExample();
        unZip.unZipIt(INPUT_ZIP_FILE, OUTPUT_FOLDER);
    }
 
    public void unZipIt(String zipFile, String outputFolder) {
 
        byte[] buffer = new byte[1024];
 
        try {
 
            //create output directory is not exists
            File folder = new File(OUTPUT_FOLDER);
            if (!folder.exists()) {
                folder.mkdir();
            }
 
            //get the zip file content
            ZipInputStream zis
                    = new ZipInputStream(new FileInputStream(zipFile));
            //get the zipped file list entry
            ZipEntry ze = zis.getNextEntry();
 
            while (ze != null) {
 
                String fileName = ze.getName();
                File newFile = new File(outputFolder + File.separator + fileName);
 
                System.out.println("file unzip : " + newFile.getAbsoluteFile());
                if (ze.isDirectory()) {
                    new File(newFile.getParent()).mkdirs();
                } else {
                    new File(newFile.getParent()).mkdirs();
 
                    FileOutputStream fos = new FileOutputStream(newFile);
 
                    int len;
                    while ((len = zis.read(buffer)) > 0) {
                        fos.write(buffer, 0, len);
                    }
 
                    fos.close();
                    ze = zis.getNextEntry();
                }
 
                zis.closeEntry();
                zis.close();
 
                System.out.println("Done");
            }
 
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
追问
ZipEntry ze = zis.getNextEntry();这个地方获取的为空。
追答

最前面有两个变量:

private static final String INPUT_ZIP_FILE = "C:\\MyFile.zip";
private static final String OUTPUT_FOLDER = "C:\\outputzip";

上面一个表示压缩包的路径,下面一个表示解压后的路径,你要根据你的情况更改成你需要的值。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式