简要介绍
**在Java学习过程中,接触到输入输出流的概念,简介了压缩与解压简单技术,实际实现解压过程遇到了一个问题,如果多个文件夹多个文档如何顺序解压。
本文以http://blog.youkuaiyun.com/isea533/article/details/7995472博客所写Java解压技术,进行总结了下,并总结过程中遇到的错误之处。**思路简析
首先声明解压文件,如上文所述如果包含多个文件夹,则存在多个解压文件进入点(Entry),则通过Enumeration(枚举)方式,循环遍历每个进入点,例如如下图1所示有两个文件夹,每次进入点路径如图2所示,通过对象强制转换到ZipEntry
,随后将目录逐层创建,如果只是单一目录文件夹,则如果不存在就将创建文件夹(在此声明,解压过程文件夹是单独创建,非解压创建),然后退出循环,不进行任何输入输出流操作。如果进入点遇到文件或文档,则将通过输入输出流方式进行解压操作。
图1:
图2:
易错误点
**1、在编写过程中,错误使用了if-else if
语句,此语句如果第一个if判断正确,则不会进行else if
语句判断。
2、运行过程遇到文件夹拒绝访问错误,X:/XX拒绝访问,通过博客http://blog.youkuaiyun.com/j04110414/article/details/17795545所写才了解到,FileOutputStream使用过程中,需要注意你针对的是文件而不是文件夹,文件夹是无法进行输出操作的。
3、本次编写jdk版本为1.7+,前文所写压缩博客无法解决如果文件名为汉字,将无法正确解压,我们只要在声明ZipFile
时,指定字符集为GBK格式,则可以解决,如下:
ZipFile zipFile = new ZipFile(zipfile, Charset.forName("gbk"));
**代码简析
UnZipFiles类
public class UnZipFiles {
public UnZipFiles() {
// TODO Auto-generated constructor stub
}
public static void unZipFiles(String zipFilePath, String targetDir) throws IOException {
// TODO Auto-generated constructor stub
unZipFiles(new File(zipFilePath), targetDir);
}
@SuppressWarnings("resource")
public static void unZipFiles(File zipfile, String targetDir){
// TODO Auto-generated method stub
File file = new File(targetDir);
if(!file.exists()){
file.mkdirs();
}
try {
ZipFile zipFile = new ZipFile(zipfile, Charset.forName("gbk"));
for (Enumeration entries = zipFile.entries(); entries.hasMoreElements();) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String subDir = (targetDir + entry.getName()).replace("\\", "/");
System.out.println(subDir);
File subFile = new File(subDir.substring(0, subDir.lastIndexOf("/")));
if (!subFile.exists()) {
subFile.mkdirs();
}
if (new File(subDir).isDirectory()) {
continue;
}
InputStream fIn = zipFile.getInputStream(entry);
FileOutputStream fOut = new FileOutputStream(subDir);
int b;
while ((b = fIn.read()) != -1) {
fOut.write(b);
}
fIn.close();
fOut.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
主函数:
public static void main(String[] args) throws IOException {
File file = new File("f:/test.zip");
String path = "f:/jieya/";
UnZipFiles unZipFiles = new UnZipFiles();
unZipFiles.unZipFiles(file, path);
}
测试成功