2个回答
展开全部
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
展开全部
试试看这个:
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";
上面一个表示压缩包的路径,下面一个表示解压后的路径,你要根据你的情况更改成你需要的值。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询