|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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我觉得最应该避免的就是:只学习,不思考,只记忆,不实践! |
|