ZIP是一种相当简单的分别压缩每个文件的存档格式。java中使用ZipFile、ZipInputStream快速读取或解压zip压缩包中的目录和文件。
完整示例:packagecom.weizhixi;
mons.io.IOUtils;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.nio.charset.Charset;
importjava.util.List;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipFile;
importjava.util.zip.ZipInputStream;
/**
*java读取zipdemo
*/
publicclassTest{
publicstaticvoidmain(String[]a)throwsException{
Filefile=newFile("C:\\Users\\XQ\\Desktop\\1.zip");
ZipFilezipFile=null;
ZipInputStreamzin=null;
FileInputStreamfis=null;
try{
Charsetgbk=Charset.forName("GBK");
zipFile=newZipFile(file,gbk);
fis=newFileInputStream(file);
zin=newZipInputStream(fis,gbk);
ZipEntryze=null;
while((ze=zin.getNextEntry())!=null){
Stringpath=ze.getName();
System.out.println(path);
if(!ze.isDirectory()&&ze.toString().endsWith("txt")){
InputStreaminputStream=zipFile.getInputStream(ze);
Listtexts=IOUtils.readLines(inputStream);
for(Stringtext:texts){
System.out.println(""+text);
}
inputStream.close();
}
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
if(zin!=null){
zin.closeEntry();
zin.close();
}
if(fis!=null)
fis.close();
if(zipFile!=null)
zipFile.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
测试:
测试zip压缩包如下图:
运行代码:测试/
测试/java/
测试/java/demo.txt
line1
line2
测试/php/
常见异常:
1、读取压缩包内文件的文件流时候,报空指针异常(即如无法获取demo.txt文件流)Exceptioninthread"main"java.lang.NullPointerException
atjava.io.Reader.(Reader.java:78)
atjava.io.InputStreamReader.(InputStreamReader.java:113)
mons.io.IOUtils.readLines(IOUtils.java:986)
mons.io.IOUtils.readLines(IOUtils.java:968)
atcom.weizhixi.Test.main(Test.java:37)
atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
atjava.lang.reflect.Method.invoke(Method.java:498)
atcom.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
这种错误是经常是由于编码问题导致。zipFile.getInputStream(ze)
zipFile 和 ze 都需要同样编码,如GBKCharsetgbk=Charset.forName("GBK");
zipFile=newZipFile(file,gbk);
zin=newZipInputStream(fis,gbk);
2、使用完后记得关闭相关流。否则文件可能被占用。尤其zipFile.getInputStream(ze)
使用的工具类
我使用IOUtils读取文件,可按需要自定义。
maven:
commons-io
commons-io
2.4
原创文章,转载请注明出处:/article/93.html