最近下载了点数据,压缩包的形式下几十兆,一解压就1G左右了,如果一个个解压再看内容实在是伤不起,于是想有没有不解压而读取压缩文件内容的方式,查阅网上资料,发现java中的java.util.zip包中提供了处理zip文件的API,小练习了一下,代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
/**
*
* @author Qingxia Liu
*
*/
public class ZipTest {
/**
* 为文件类型分类,以适当形式调用读取函数
* 调用格式,如ZipTest.display("F:\\DBpedia\\tst\\my.zip");
* @param filename 压缩文件的文件名
*/
public static void display(String filename){
File file = new File(filename);
if(file.isDirectory()){
File[] list = file.listFiles();
for(int i=0; i<list.length; i++){
ZipTest.display(list[i]);
}
}else{
ZipTest.display(file);
}
}
/**
* 依次读取压缩包中各文件内容
* @param file
*/
public static void display(File file){
String entryname = "abc";
try {
// System.out.println(file.toString());
ZipFile zip = new ZipFile(file);//由指定的File对象打开供阅读的ZIP文件
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();//获取zip文件中的各条目(子文件)
// ZipInputStream zis = new ZipInputStream(zip.getInputStream(zip.entries().nextElement()));
while(entries.hasMoreElements()){//依次访问各条目
ZipEntry ze = (ZipEntry) entries.nextElement();
BufferedReader br = new BufferedReader(new InputStreamReader(zip.getInputStream(ze)));
System.out.println("\n"+ze.getName()+":");
String line ;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
}
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 读取压缩包file中,指定文件名entryname的文件的内容
* @param file
* @param entryname
*/
public static void display(File file, String entryname){
try {
// System.out.println(file.toString());
ZipFile zip = new ZipFile(file);
// ZipInputStream zis = new ZipInputStream(zip.getInputStream(zip.entries().nextElement()));
ZipEntry ze = zip.getEntry(entryname);//根据文件名取得压缩包中的对应条目
System.out.println(ze.getName()+":");
BufferedReader br = new BufferedReader(new InputStreamReader(zip.getInputStream(ze)));
String line ;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
String filename = "F:\\DBpedia\\tst\\my.zip";
ZipTest.display(filename);
}
}
通过这样的方式,可以不用将文件解压出来就从控制台看到文件的内容。其中主要是使用了ZipFile、ZipEntry这两个类,其他过程和一般文件的读取差不多,本来看到API中有个ZipInputStream想用用的,没用成暂时也不想折腾,如果有用过的欢迎交流。
另外,我下载的压缩文件是bz2格式的,但我上面所写的这个程序貌似能读取zip和rar格式的,不能读取.bz2格式的文件(否则就会在实例化ZipFile的那行报错,“java.util.zip.ZipException: error in opening zip file”,网上找了下也没有好的方法,只好继续悲催地解压了再看了,不知道谁有没有读取bz2格式文件的好方法。