Java实现批量解压zip文件

到网上下载的教学视频一般都是经过层层压缩的,手动解压的耗时耗力,遂写了个程序自动解压。

主要利用了Java核心库中的ZipInputStream类。

代码:

其中File src为目标文件,String des为要存储到的存储路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void unZip(File src,String des) throws Exception {

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(src),
Charset.forName("gbk"));

ZipEntry zipEntry = null;

while((zipEntry = zipInputStream.getNextEntry()) != null) {
File file = new File(des + File.separator + zipEntry.getName());

if(zipEntry.isDirectory()) {
file.mkdirs();
continue;
}

file.getParentFile().mkdirs();

int len;
FileOutputStream out = new FileOutputStream(file);

while((len = zipInputStream.read(buffer)) != -1) {
out.write(buffer,0,len);
}
out.close();
}
zipInputStream.closeEntry();
zipInputStream.close();
}

遇到的问题:
在定义ZipInputStream类时,如果不指定文件流的编码格式,则默认为utf-8。假如要解压的文件路径中包含中文,则会抛出异常:

1
Exception in thread "main" java.lang.IllegalArgumentException: malformed input off : 19, length : 1

这时就要手动指定编码格式了。

见源码:

1
2
3
public ZipInputStream(InputStream in) {
this(in, StandardCharsets.UTF_8);
}

1
2
3
4
5
6
7
8
9
10
public ZipInputStream(InputStream in, Charset charset) {
super(new PushbackInputStream(in, 512), new Inflater(true), 512);
usesDefaultInflater = true;
if (in == null) {
throw new NullPointerException("in is null");
}
if (charset == null)
throw new NullPointerException("charset is null");
this.zc = ZipCoder.get(charset);
}

由于ZipInputStream中是没有编码常量的,所以需要借助Charset.forName("gbk")来指定。

-------------本文结束感谢您的阅读-------------
0%