仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1270|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之Java的文件操纵--2(Zip文件开释)

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:52:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。在java中专门有一个对zip文件操纵的包(java.util.zip),对zip文件操纵挺便利的,前次说写一个zip文件开释程序,花了一地利间终究写完了,起先想起来挺复杂的:道理就是将zip文件中的文件夹和文件经由过程ZipInputStream和ZipEntry类逐一得出,然后分离再对应目次下创立文件和文件夹。但是完成起来就不是那末回事了,个中有很多多少细节成绩都欠好办理,个中在挪用ZipInputStream中的getNextEntry办法时假如zip文件中包括中文路径名大概文件名就会抛出非常,以是这段程序不免会有很多毛病和bug,乃至另有些思绪上的成绩,但愿人人能多提定见。
实在java中对文件的操纵就是对输出输入流的使用和把持,如许讲有些范,可是假如你了解了流的使用就会以为对文件操纵本来就是如许呀!可是你万万不要觉得java的输出输入就这么复杂,会用和用的好是两回事,就象一样描述头脑坚定,判断和果断就是两个一模一样的形貌,因而要想用好java的收支输入还必要多多实习,多多思索。好了,说了那末多都是些空话,上面是程序源码,但愿对人人有效!
pcera
2005-7-217:44
/**
*类名:zipFileRelease
*申明:对zip文件解压,开释在指定,目次下
*先容:次要的zip文件开释办法releaseHandle()
*用ZipInputStream类和ZipEntry类将zip文件的出口清单枚举出来,然后
*依据用户供应的输入路径和zip文件的出口举行组合经由过程DataOutputStream
*和File类举行文件的创立和目次的创立,创立文件时的文件数据是经由过程
*ZipInputStream类、ZipEntry类、InputStream类之间的套嵌组合取得的。
*注重:假如zip文件中包括中文路径程序将会抛出非常
*日期:2005-7-1
*Pcera
*/
importjava.io.*;
importjava.util.*;
importjava.util.zip.*;
classzipFileRelease{
privateStringinFilePath;
privateStringreleaseFilePath;
privateString[]FileNameArray;//寄存文件称号的数组
privateZipEntryentry;
//
privateFileInputStreamfileDataIn;
privateFileOutputStreamfileDataOut;
privateZipInputStreamzipInFile;
privateDataOutputStreamwriteData;
privateDataInputStreamreadData;
//
privateintzipFileCount=0;//zip文件中的文件总数
privateintzipPathCount=0;//zip文件中的路径总数
/**
*初始化函数
*初始化zip文件流、输入文件流和其他变量的初始化
*/
publiczipFileRelease(Stringinpath,Stringreleasepath){
inFilePath=inpath;
releaseFilePath=releasepath;
}
/**
*初始化读取文件流函数
*参数:FileInputStream类
*前往值:初始化乐成前往0,不然前往-1
*/
protectedlonginitInStream(ZipInputStreamzipFileA){
try{
readData=newDataInputStream(zipFileA);
return0;
}catch(Exceptione){
e.printStackTrace();
return-1;
}
}
/**
*测试文件路径
*参数:zip文件的路径和要开释的地位
*前往值:是两位整数,两位数中的十位代表输出路径和输入路径(1输出、2输入)
*列位数是代表相对路径仍是绝对路径(1相对、0绝对)
*前往-1暗示路径有效
protectedlongcheckPath(StringinPath,StringoutPath){
Fileinfile=newFile(inPath);
Fileinfile=newFile(outPath);
}
*/
/**
*初始化输入文件流
*参数:File类
*前往值:初始化乐成前往0,不然前往-1
*/
protectedlonginitOutStream(StringoutFileA){
try{
fileDataOut=newFileOutputStream(outFileA);
writeData=newDataOutputStream(fileDataOut);
return0;
}catch(IOExceptione){
e.printStackTrace();
return-1;
}
}
/**
*测试文件是不是存在办法
*参数:File类
*前往值:假如文件存在前往文件巨细,不然前往-1
*/
publiclongcheckFile(FileinFileA){
if(inFileA.exists()){
return0;
}else{
return-1;
}
}
/**
*判别文件是不是能够读取办法
*参数:File类
*前往值:假如能够读取前往0,不然前往-1
*/
publiclongcheckOpen(FileinFileA){
if(inFileA.canRead()){
returninFileA.length();
}else{
return-1;
}
}
/**
*取得zip文件中的文件夹和文件总数
*参数:File类
*前往值:假如一般取得则前往总数,不然前往-1
*/
publiclonggetFilFoldCount(StringinfileA){
try{
intfileCount=0;
zipInFile=newZipInputStream(
newFileInputStream(infileA));
while((entry=zipInFile.getNextEntry())!=null){
if(entry.isDirectory()){
zipPathCount++;
}else{
zipFileCount++;
}
fileCount++;
}
returnfileCount;
}catch(IOExceptione){
e.printStackTrace();
return-1;
}
}
/**
*读取zip文件清单函数
*参数:File类
*前往值:文件清双数组
*/
publicString[]getFileList(StringinfileA){
try{
ZipInputStreamAzipInFile=newZipInputStream(
newFileInputStream(infileA));
//创立数组对象
FileNameArray=newString[(int)getFilFoldCount(infileA)];
//将文件名清单传进数组
inti=0;
while((entry=AzipInFile.getNextEntry())!=null){
FileNameArray[i++]=entry.getName();
}
returnFileNameArray;
}catch(IOExceptione){
e.printStackTrace();
returnnull;
}
}
/**
*创立文件函数
*参数:File类
*前往值:假如创立乐成前往0,不然前往-1
*/
publiclongwriteFile(StringoutFileA,byte[]dataByte){
try{
if(initOutStream(outFileA)==0){
writeData.write(dataByte);
fileDataOut.close();
return0;
}else{
fileDataOut.close();
return-1;
}
}catch(IOExceptione){
e.printStackTrace();
return-1;
}
}
/**
*读取文件内容函数
*参数:File类
*前往值:假如读取乐成则前往读取数据的字节数组,假如失利则前往空值
*/
protectedbyte[]
readFile(ZipEntryentryA,ZipInputStreamzipFileA){
try{
longentryFilelen;
if(initInStream(zipFileA)==0){
if((entryFilelen=entryA.getSize())>=0){
byte[]entryFileData=newbyte[(int)entryFilelen];
readData.readFully(entryFileData,0,(int)entryFilelen);
returnentryFileData;
}else{
returnnull;
}
}else{
returnnull;
}
}catch(IOExceptione){
e.printStackTrace();
returnnull;
}
}
/**
*创立目次函数
*参数:要创立目次的路径
*前往值:假如创立乐成则前往0,不然前往-1
*/
publiclongcreateFolder(Stringdir){
Filefile=newFile(dir);
if(file.mkdirs()){
return0;
}else{
return-1;
}
}
/**
*删除文件
*参数:要删除的文件
*前往值:假如删除乐成则前往0,要删除的文件不存在前往-2
*假如要删除的是个路径则前往-3,删除失利则前往-1
*/
publiclongdeleteFile(StringApath)throwsSecurityException{
Filefile=newFile(Apath.trim());
//文件或路径不存在
if(!file.exists()){
return-2;
}
//要删除的是个路径
if(!file.isFile()){
return-3;
}
//删除
if(file.delete()){
return0;
}else{
return-1;
}
}
/**
*删除目次
*参数:要删除的目次
*前往值:假如删除乐成则前往0,删除失利则前往-1
*/
publiclongdeleteFolder(StringApath){
Filefile=newFile(Apath);
//删除
if(file.delete()){
return0;
}else{
return-1;
}
}
/**
*判别所要解压的路径是不是存在同名文件
*参数:解压路径
*前往值:假如存在同名文件前往-1,不然前往0
*/
publiclongcheckPathExists(StringAreleasePath){
Filefile=newFile(AreleasePath);
if(!file.exists()){
return0;
}else{
return-1;
}
}
/**
*删除zip中的文件
*参数:文件清双数组,开释路径
*前往值:假如删除乐成前往0,不然前往-1
*/
protected
longdeleteReleaseZipFile(String[]listFilePath,StringreleasePath){
longarrayLen,flagReturn;
intk=0;
StringtempPath;
//寄存zip文件清单的路径
String[]pathArray=newString[zipPathCount];
//删除文件
arrayLen=listFilePath.length;
for(inti=0;i<(int)arrayLen;i++){
tempPath=releasePath.replace(,/)+listFilePath[i];
flagReturn=deleteFile(tempPath);
if(flagReturn==-2){
//甚么都不作
}elseif(flagReturn==-3){
pathArray[k++]=tempPath;
}elseif(flagReturn==-1){
return-1;
}
}
//删除路径
for(k=k-1;k>=0;k--){
flagReturn=deleteFolder(pathArray[k]);
if(flagReturn==-1)return-1;
}
return0;
}
/**
*取得zip文件的最下层的文件夹称号
*参数:zip文件路径
*前往值:文件夹称号,假如失利则前往null
*/
publicStringgetZipRoot(StringinfileA){
StringrootName;
try{
FileInputStreamtempfile=newFileInputStream(infileA);
ZipInputStreamAzipInFile=newZipInputStream(tempfile);
ZipEntryAentry;
Aentry=AzipInFile.getNextEntry();
rootName=Aentry.getName();
tempfile.close();
AzipInFile.close();
returnrootName;
}catch(IOExceptione){
e.printStackTrace();
returnnull;
}
}
/**
*开释流,开释占用资本
*/
protectedvoidcloseStream()throwsException{
fileDataIn.close();
fileDataOut.close();
zipInFile.close();
writeData.flush();
}
/**
*解压函数
*对用户的zip文件路径息争压路径举行判别,是不是存在和翻开
*在输出解压路径时假如输出"/"则在和zip文件寄存的统计目次下举行解压
*前往值:0暗示开释乐成
*-1暗示您所要解压的文件不存在、
*-2暗示您所要解压的文件不克不及被翻开、
*-3您所要开释的路径不存在、
*-4您所创立文件目次失利、
*-5写进文件失利、
*-6暗示所要开释的文件已存在、
*-50暗示文件读取非常
*/
publiclongreleaseHandle()throwsException{
FileinFile=newFile(inFilePath);
FileoutFile=newFile(releaseFilePath);
StringtempFile;
StringzipPath;
StringzipRootPath;
StringtempPathParent;//寄存开释路径
byte[]zipEntryFileData;
//作无效性判别
if(checkFile(inFile)==-1){
return-1;}
if(checkOpen(inFile)==-1){
return-2;}
//不是解压再以后目次下时对路径作无效性查验
if(!releaseFilePath.equals("/")){
//解压在用户指定目次下
if(checkFile(outFile)==-1){
return-3;}
}
//取得尺度开释路径
if(!releaseFilePath.equals("/")){
tempPathParent=releaseFilePath.replace(,/)+"/";
}else{
tempPathParent=inFile.getParent().replace(,/)+"/";
}
//取得zip文件中的出口清单
FileNameArray=getFileList(inFilePath);
//取得zip文件的最下层目次
zipRootPath=getZipRoot(inFilePath);
//
fileDataIn=newFileInputStream(inFilePath);
zipInFile=newZipInputStream(fileDataIn);
//判别是不是已存在要开释的文件夹
if(checkPathExists(tempPathParent+
zipRootPath.substring(0,zipRootPath.lastIndexOf("/")))==-1){
return-6;
}
//
try{
//创立文件夹和文件
inti=0;
while((entry=zipInFile.getNextEntry())!=null){
if(entry.isDirectory()){
//创立目次
zipPath=tempPathParent+FileNameArray[i];
zipPath=zipPath.substring(0,zipPath.lastIndexOf("/"));
if(createFolder(zipPath)==-1){
closeStream();
deleteReleaseZipFile(FileNameArray,tempPathParent);
return-4;
}
}else{
//读取文件数据
zipEntryFileData=readFile(entry,zipInFile);
//向文件写数据
tempFile=tempPathParent+FileNameArray[i];
//写进文件
if(writeFile(tempFile,zipEntryFileData)==-1){
closeStream();
deleteReleaseZipFile(FileNameArray,tempPathParent);
return-5;
}
}
i++;
}
//开释资本
closeStream();
return0;
}catch(Exceptione){
closeStream();
deleteReleaseZipFile(FileNameArray,tempPathParent);
e.printStackTrace();
return-50;
}
}
/**
*演示函数
*依据用户输出的路径对文件举行解压
*/
publicstaticvoidmain(Stringargs[])throwsException{
longflag;//前往标记
StringinPath,releasePath;
//取得用户输出信息
BufferedReaderuserInput=newBufferedReader(
newInputStreamReader(System.in));
System.out.println("请输出zip文件路径:");
inPath=userInput.readLine();
System.out.println("请输出保留路径:");
releasePath=userInput.readLine();
userInput.close();
//实行解紧缩
zipFileReleasepceraZip=newzipFileRelease(inPath,releasePath);
flag=pceraZip.releaseHandle();
//堕落信息打印
if(flag==0)System.out.println("开释乐成!!!");
if(flag==-1)System.out.println("您所要解压的文件不存在!");
if(flag==-2)System.out.println("您所要解压的文件不克不及被翻开!");
if(flag==-3)System.out.println("您所要开释的路径不存在!");
if(flag==-4)System.out.println("您所创立文件目次失利!");
if(flag==-5)System.out.println("写进文件失利!");
if(flag==-6)System.out.println("文件已存在!");
if(flag==-50)System.out.println("文件读取非常!");
}
}

而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
兰色精灵 该用户已被删除
沙发
 楼主| 发表于 2015-1-18 13:43:07 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
板凳
发表于 2015-1-22 05:47:30 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
admin 该用户已被删除
地板
发表于 2015-1-30 23:10:05 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
老尸 该用户已被删除
5#
发表于 2015-2-2 21:39:07 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
变相怪杰 该用户已被删除
6#
发表于 2015-2-8 06:33:26 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
小魔女 该用户已被删除
7#
发表于 2015-2-14 21:05:32 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
若相依 该用户已被删除
8#
发表于 2015-2-16 21:46:27 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
分手快乐 该用户已被删除
9#
发表于 2015-3-5 10:09:37 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
小女巫 该用户已被删除
10#
发表于 2015-3-11 08:20:47 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
再见西城 该用户已被删除
11#
发表于 2015-3-11 21:32:48 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
不帅 该用户已被删除
12#
发表于 2015-3-19 14:21:38 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
透明 该用户已被删除
13#
发表于 2015-3-20 06:48:05 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
爱飞 该用户已被删除
14#
发表于 2015-3-27 22:08:35 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
活着的死人 该用户已被删除
15#
发表于 2015-4-8 08:49:08 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
谁可相欹 该用户已被删除
16#
发表于 2015-4-9 15:33:54 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
灵魂腐蚀 该用户已被删除
17#
发表于 2015-4-11 03:11:35 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
飘灵儿 该用户已被删除
18#
发表于 2015-4-16 10:39:37 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
莫相离 该用户已被删除
19#
发表于 2015-4-19 23:13:42 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小妖女 该用户已被删除
20#
发表于 2015-4-24 12:46:54 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 12:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表