6
Java把文件压缩成.zip压缩包和解压.zip压缩包
source link: https://blog.51cto.com/zhanjq/5981215
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Java把文件压缩成.zip压缩包和解压.zip压缩包
精选 原创压缩成.zip
代码如下:
/**
* 压缩成ZIP
*
* @param srcDir 压缩文件夹路径
* @param out 压缩文件输出流
* @throws RuntimeException 压缩失败会抛出运行时异常
*/
public static void toZip(String srcDir, OutputStream out) throws RuntimeException {
long start = System.currentTimeMillis();
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
File sourceFile = new File(srcDir);
compress(sourceFile, zos, sourceFile.getName(), false);
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 递归压缩方法
*
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
* <p>
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws Exception
*/
private static void compress(File sourceFile, ZipOutputStream zos, String name,
boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[BUFFER_SIZE];
if (sourceFile.isFile()) {
// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
zos.putNextEntry(new ZipEntry(name));
// copy文件到zip输出流中
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// Complete the entry
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
// 需要保留原来的文件结构时,需要对空文件夹进行处理
if (KeepDirStructure) {
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(name + "/"));
// 没有文件,不需要文件的copy
zos.closeEntry();
}
} else {
for (File file : listFiles) {
// 判断是否需要保留原来的文件结构
if (KeepDirStructure) {
// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
compress(file, zos, name + "/" + file.getName(), KeepDirStructure);
} else {
compress(file, zos, file.getName(), KeepDirStructure);
}
}
}
}
}
测试验证代码:
/**
* 测试打包本地的Navicat,输出为zip文件
* @throws Exception
*/
@Test
public void test() throws Exception {
//Navicat路径
String inDir = "E:\\developer\\Navicat";
//打包后输出路径
String outDir = "E:\\developer\\NavicatZip\\Navicat.zip";
OutputStream fileOutputStream = new FileOutputStream(new File(outDir));
ZipUtils.toZip(inDir, fileOutputStream);
}
打包前后的文件如下:
解压.zip
代码如下:
/**
* 解压zip文件到指定目录
* @param fileZip
* @param path_to_dest
* @throws IOException
*/
public static void readZip(String fileZip,String path_to_dest) throws IOException {
try (FileInputStream fis = new FileInputStream(fileZip);
ZipInputStream zis =
new ZipInputStream(new BufferedInputStream(fis))) {
ZipEntry entry;
// 从ZipInputStream读取每个条目,直到没有
// 发现更多条目,返回值为空
// getNextEntry()方法。
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Unzipping: " + entry.getName());
int size;
byte[] buffer = new byte[2048];
File fileOut = new File(path_to_dest+"\\"+entry.getName());
try (FileOutputStream fos =
new FileOutputStream(fileOut);
BufferedOutputStream bos =
new BufferedOutputStream(fos, buffer.length)) {
while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, size);
}
bos.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
测试验证代码:
/**
* 测试解压本地zip文件
* @throws Exception
*/
@Test
public void readZip() throws Exception {
//解压后路径
String path_to_dest = "E:\\developer\\NavicatUnzip";
//zip文件路径
String fileZip = "E:\\developer\\NavicatZip\\Navicat.zip";
ZipUtils.readZip(fileZip, path_to_dest);
}
解压前后的文件如下:
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
主页: 共饮一杯无的博客汇总👨💻保持热爱,奔赴下一场山海。🏃🏃🏃
- 1赞
- 1收藏
- 评论
- 分享
- 举报
上一篇:字节缓冲流与字符缓冲流
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK