如何在Java中读取压缩文件的内容而无需解压缩

5

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

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

提前感谢您!

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
}

1
你的问题表述不够清晰。你是想要从ZIP文件中提取文件吗?你具体想解决什么问题? - parsifal
顺便说一句:导航系统也是这样做的,它们将数字路线地图数据压缩在主存储器中,并根据需要解压部分数据。 - AlexWien
3个回答

5

您的想法是将zip文件作为字节数组读取并存储在变量中。以后在需要时,按需提取zip文件,节省内存:

首先将Zip文件的内容读入一个字节数组 zipFileBytes

如果您使用的是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);

5

试试这个:

    String zipFile = "ex.zip";
    try (ZipFile zip = new ZipFile(zipFile)) {
        int i = 0;
        for (Enumeration<? extends ZipEntry> e = zip.entries(); e.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            System.out.println(entry);
            System.out.println(i);

            InputStream in = zip.getInputStream(entry);
        }
    }

例如,如果文件包含文本,并且您想将其作为字符串打印,可以像这样读取InputStream:如何在Java中将InputStream读取/转换为String?

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"));

那不是答案,他想要将zip压缩文件以变量形式存储。引用:“我不想每次都在磁盘上解压缩zip文件,然后读取其数据。” - AlexWien
@AlexWien,它并不会扩展整个文件,只是允许逐字节或按行读取内容,并且我理解OP想要的就是这个。我只是想指出一种比zip文件更易于使用的替代方法。在变量中存储zip文件在我看来没有实际应用。 - fvu
不清楚他想要什么,也许他想要你的解决方案是在不创建新文件的情况下解压缩。保留zip文件在变量中并不总是愚蠢的做法:从字节数组解压缩比从文件读取更快。想象一下,如果你必须每秒解压缩100次,你不能通过磁盘访问在低缓存的嵌入式设备上完成。有许多应用程序,例如地图匹配系统,计算车辆行驶的轨迹,在两个大国家:从磁盘读取将会太慢。 - AlexWien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接