如何在不提取java的情况下读取Zipped文件的内容

时间:2013-02-08 18:26:16

标签: java unzip zipfile

我的文件名为ex.zip。在这个例子中,Zip文件只包含一个具有相同名称的文件(即“ex.txt”),这个文件非常大。我不想每次都提取zip文件。因此我需要在不解压缩zip文件的情况下读取文件的内容(ex.txt)。我尝试了一些类似下面的代码但是我只能读取变量中文件的名称。

如何阅读文件内容并将其存储在变量中?

先谢谢你

fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip");
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;

while((entry = zis.getNextEntry()) != null) {
    i=i+1; 
    System.out.println(entry);
    System.out.println(i);
    //read from zis until available
}

3 个答案:

答案 0 :(得分:5)

您的想法是将zip文件读取为字节数组并将其存储在变量中。 稍后当您需要zip时,可以根据需要提取它,从而节省内存:

首先在字节数组中读取Zip文件的内容 zipFileBytes

如果你有Java 1.7:

Path path = Paths.get("path/to/file");
byte[] zipFileBytes= Files.readAllBytes(path);

否则使用Appache.commons lib

byte[] zipFileBytes;
zipFileBytes = IOUtils.toByteArray(InputStream input);

现在你的Zip文件存储在变量zipFileBytes中,仍然是压缩形式。

然后当你需要提取一些东西时使用

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes));
ZipInputStream zis = new ZipInputStream(bis);

答案 1 :(得分:5)

试试这个:

        ZipFile fis = new ZipFile("ex.zip");

        int i = 0;
        for (Enumeration e = zip.entries(); e.hasMoreElements();) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            System.out.println(entry);
            System.out.println(i);

            InputStream in = fis.getInputStream(entry);

        }

例如,如果文件包含文本,并且您想将其打印为String,则可以像这样读取InputStream:Read/convert an InputStream to a String

答案 2 :(得分:2)

我认为在你的情况下,zipfile是一个可以容纳许多文件的容器(因此每次打开它时强制你导航到正确包含的文件)的事实会使事情变得非常复杂,因为你说每个zipfile只包含一个文本文件。也许只是gzip文本文件(gzip不是容器,只是数据的压缩版本)要容易得多。它使用起来非常简单:

GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz"));
// and a BufferedReader on top to comfortably read the file
BufferedReader in = new BufferedReader(new InputStreamReader(gis) );

制作它们同样简单:

GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz"));