java zip压缩与解压
程序员文章站
2022-05-15 12:53:37
...
package com.yiban.rec.bill.parse.util;
import java.io.BufferedInputStream;
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.nio.charset.Charset;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.IOUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
public class ZipUtil {
private static final int buffer = 2048;
/**
*
* @param zipFilePath
* 压缩文件名
* @param chartSet
* 字符编码
* @return 文件字符串
* @throws Exception
* 重新抛出异常
*/
public static String unZipFiles(String zipFilePath, String chartSet) throws Exception {
ZipFile zipFile = null;
try {
File f = new File(zipFilePath);
if ((!f.exists()) && (f.length() <= 0)) {
throw new RuntimeException("要解压的文件不存在!");
}
// 一定要加上编码,之前解压另外一个文件,没有加上编码导致不能解压
zipFile = new ZipFile(f, chartSet);
Enumeration<ZipEntry> e = zipFile.getEntries();
StringBuilder sb = new StringBuilder();
while (e.hasMoreElements()) {
// 使用ant.jar 的解压缩工具包代替jdk自带的
org.apache.tools.zip.ZipEntry zipEnt = e.nextElement();
if (!zipEnt.isDirectory()) {
// 读写文件
InputStream is = zipFile.getInputStream(zipEnt);
BufferedInputStream bis = new BufferedInputStream(is);
List<String> list = IOUtils.readLines(bis, Charset.forName(chartSet));
for (String str : list) {
sb.append(str);
}
bis.close();
is.close();
}
}
return sb.toString();
} catch (Exception e) {
throw e;
} finally {
if (zipFile != null) {
zipFile.close();
}
}
}
/**
* 解压Zip文件
*
* @param path
* 文件目录
*/
public static void unZip(String path) {
int count = -1;
String savepath = "";
File file = null;
InputStream is = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
savepath = path.substring(0, path.lastIndexOf(".")) + File.separator; // 保存解压文件目录
new File(savepath).mkdir(); // 创建保存目录
ZipFile zipFile = null;
try {
zipFile = new ZipFile(path, "gbk"); // 解决中文乱码问题
Enumeration<?> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
byte buf[] = new byte[buffer];
ZipEntry entry = (ZipEntry) entries.nextElement();
String filename = entry.getName();
boolean ismkdir = false;
if (filename.lastIndexOf("/") != -1) { // 检查此文件是否带有文件夹
ismkdir = true;
}
filename = savepath + filename;
if (entry.isDirectory()) { // 如果是文件夹先创建
file = new File(filename);
file.mkdirs();
continue;
}
file = new File(filename);
if (!file.exists()) { // 如果是目录先创建
if (ismkdir) {
new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); // 目录先创建
}
}
file.createNewFile(); // 创建文件
is = zipFile.getInputStream(entry);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, buffer);
while ((count = is.read(buf)) > -1) {
bos.write(buf, 0, count);
}
bos.flush();
bos.close();
fos.close();
is.close();
}
zipFile.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (bos != null) {
bos.close();
}
if (fos != null) {
fos.close();
}
if (is != null) {
is.close();
}
if (zipFile != null) {
zipFile.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
//unZip("F:\\110000002.zip");
unZip("E:\\2088721459821834-2018-12-11.zip");
String f = "E:\\2088721459821834-2018-12-11";
File file = new File(f);
String[] test=file.list();
for(int i=0;i<test.length;i++){
System.out.println(test[i]);
}
/* System.out.println("------------------");
String fileName = "";
File[] tempList = file.listFiles();
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
System.out.println("文 件:"+tempList[i]);
fileName = tempList[i].getName();
System.out.println("文件名:"+fileName);
}
if (tempList[i].isDirectory()) {
System.out.println("文件夹:"+tempList[i]);
}
}*/
}
}
上一篇: java 解析压缩文件-rar,zip
下一篇: 把字符内容转换为二进制