ZipEntry压缩解压文件夹、文件问题

吖~ 2015-05-13 03:35:56
写了一个压缩解压文件夹、文件的程序,存在一些问题:

使用递归方式进行文件夹压缩,当file为文件夹(isDrectory()为true)时,new Entry需要在后边加上File.separator(分隔符),可以完成压缩,但压缩的文件在进行解压时会出现问题,之前的文件夹解压getNextEntry后的Entry的isDrectory()为false,导致file也为false。压缩前与压缩后的isDrectory()不一致,怎样解决这一问题呢?
1.压缩
	public static void fun() throws Exception{
File file = new File("d:" + File.separator+"xu");
File zipFile = new File("d:" + File.separator+"xu.zip");
ZipOutputStream zipOut = null;
zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
String name = "";
putEntry(file,zipOut,name);
zipOut.close();
}

public static void putEntry(File file,ZipOutputStream zipOut,String name) throws Exception{
if(file.exists()){
if(file.isDirectory()){
//递归
name = name + file.getName() + File.separator;
ZipEntry zipEntry = new ZipEntry(name);
zipOut.putNextEntry(zipEntry);
System.out.println("此时的file是不是目录呢:" + file.isDirectory() +", 此时的zipEntry是不是目录呢:" + zipEntry.isDirectory());
File lists [] = file.listFiles();
for(int i = 0;i<lists.length;i++){
putEntry(lists[i],zipOut,name);
}
}else{
ZipEntry zipEntry = new ZipEntry(name + file.getName());
zipOut.putNextEntry(zipEntry);
System.out.println("此时的file是不是目录呢:" + file.isDirectory() +", 此时的zipEntry是不是目录呢:" + zipEntry.isDirectory());
int temp = 0;
InputStream input = null;

input = new FileInputStream(file);
while((temp = input.read()) != -1){
zipOut.write(temp);
}
input.close();
}
}
}

2.解压
	public static void fun() throws Exception{
File file = new File("d:" + File.separator + "xu.zip"); //定义压缩文件名称
File outFile = null; //输出文件的时候要有文件夹的操作
ZipFile zipFile = new ZipFile(file); //实例化ZipFile对象
ZipInputStream zipInput = null; //定义压缩输入流
OutputStream out = null; //定义输出流,用于输出每一个实体内容
InputStream input = null; //定义输入流,读取每一个ZipEntry
ZipEntry entry = null; //每一个压缩实体
zipInput = new ZipInputStream(new FileInputStream(file)); //实例化ZipInputStream
while((entry = zipInput.getNextEntry()) != null){ //得到一个压缩实体
System.out.println("刚解压出来的是目录吗" + entry.isDirectory());
System.out.println("解压缩" + entry.getName() + "文件。"); //
outFile = new File("d:" + File.separator + entry.getName()); //定义输出的文件路径
if(!outFile.getParentFile().exists()){ //如果输出文件夹不存在
outFile.getParentFile().mkdir(); //创建文件夹
}
if(!outFile.exists()){ //判断输出文件是否存在
if(entry.isDirectory()){
outFile.mkdir();
System.out.println("我是一个目录,正在创建");
}else{
outFile.createNewFile(); //创建文件
System.out.println("我是一个普普通通的文件,正在创建");
input = zipFile.getInputStream(entry); //得到每一个实体的输入流
out = new FileOutputStream(outFile); //实例化文件输出流
int temp = 0;
while((temp = input.read()) != -1){
out.write(temp);
}
input.close();
out.close();
}
}

}
}
...全文
252 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
Re: 《文件备份与压缩命令》 ---------------------------------------内容提要: 1/6)tar   命令:打包备份/解压打包(将文件或目录的压缩或不解压查看查看)2/6)gzip  命令:压缩解压文件3/6)zip   命令:打包和压缩文件4/6)unzip 命令:解压zip文件5/6)scp   命令:远程文件复制(全量备份)6/6)rsync 命令:文件同步工具(增量备份)  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述! 《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧