如何在不提取Java的情况下读取压缩文件的内容

Posted

技术标签:

【中文标题】如何在不提取Java的情况下读取压缩文件的内容【英文标题】:How to read content of the Zipped file without extracting in java 【发布时间】:2013-02-08 18:26:16 【问题描述】:

我有类似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

【问题讨论】:

正如所写,您的问题非常不清楚。是否要从 ZIP 中提取文件?您想解决什么具体问题 顺便说一句:导航系统也是这样做的,它们将数字路线图数据压缩在主内存中,并按需解压缩部分 【参考方案1】:

试试这个:

        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

【讨论】:

【参考方案2】:

您的想法是将压缩文件原样读取到字节数组中并将其存储在变量中。 稍后当您需要 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);

【讨论】:

【参考方案3】:

我认为在您的情况下,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 在变量中。 Quote: 我不想每次都在磁盘上提取zip文件然后读取它的数据 @AlexWien 它没有,它只允许读取内容(逐字节或逐行显示)无需扩展一次整个文件,它我的理解是这就是 OP 所追求的。我只是想指出一种压缩文件的替代方法,它比 zip 文件更易于使用。将 zip 文件这样存储在变量 imo 中没有实际应用。 不清楚,他想要什么,也许他想要你的解决方案是什么,解压缩而不在磁盘上创建一个新文件。将 zip 文件保存在变量中并不总是愚蠢的:它从字节数组中解压缩的方式比从文件中读取更快:想象一下,您必须在一秒钟内解压缩 100 次,您无法在具有磁盘访问权限的嵌入式设备上做到这一点低缓存。有很多应用:例如地图匹配系统,计算车辆在两个大国行驶的轨迹:从磁盘读取会很慢

以上是关于如何在不提取Java的情况下读取压缩文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

java如何读取压缩包中的文本文件

HP-UX - 如何在不解压缩的情况下从 tar 存档中读取文本文件?

如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql

如何在不实际提取文件的情况下使用 VBScript 读取 .zip 文件的内容?

如何在不将文件写入光盘的情况下创建文件并压缩它们?

如何在不使用 Qt 内部头文件的情况下压缩 QEvents?