5

我的文件名称如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
}
4

3 回答 3

5

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

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

如果您有 Java 1.7:

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

否则使用 Appache.commons 库

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

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

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

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes));
ZipInputStream zis = new ZipInputStream(bis);
于 2013-02-08T18:28:31.343 回答
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);

        }

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

于 2013-02-08T18:32:48.553 回答
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"));
于 2013-02-08T18:38:40.813 回答