当前位置: 首页 > 知识库问答 >
问题:

使用Commons压缩在Java中读取tar.gz

柯升
2023-03-14

我想读取一个thing文件(或者一个xy文件)的内容,但这是一回事。我所做的或多或少是这样的:

TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream("c://temp//test.tar.gz")));
TarArchiveEntry currentEntry = tarInput.getNextTarEntry();
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
while (currentEntry != null) {
    File f = currentEntry.getFile();
    br = new BufferedReader(new FileReader(f));
    System.out.println("For File = " + currentEntry.getName());
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println("line="+line);
    }
}
if (br!=null) {
    br.close();
}

但是当我调用TarArchiveEntrygetFile方法时,我得到null。
我正在使用Apache公共压缩1.8.1

共有1个答案

计燕七
2023-03-14

您不能使用TarArchiveEntry的getFile。当您在tar文件中压缩文件时,该getter仅用于相反的操作。

相反,您应该直接从TarArchiveInputStream读取。它会负责将“文件”的内容动态地解压缩并返回给你。

例如(未测试代码,YMMV):

TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream("c://temp//test.tar.gz")));
TarArchiveEntry currentEntry = tarInput.getNextTarEntry();
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
while (currentEntry != null) {
    br = new BufferedReader(new InputStreamReader(tarInput)); // Read directly from tarInput
    System.out.println("For File = " + currentEntry.getName());
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println("line="+line);
    }
    currentEntry = tarInput.getNextTarEntry(); // You forgot to iterate to the next file
}
 类似资料:
  • 我有一个学校作业,要求我接受一个输入流,并使用apache commons压缩库将其压缩成一个字节数组,格式有5种(根据用户规范)。这5种格式是:ZIP、JAR、SEVENZ、BZIP2和gzip。我编写了以下方法以JAR格式压缩输入流,但得到了一个带有字符串“no current entry”的illegalStateException。

  • 我正在尝试使用我从apache共享资源压缩示例网页获得的以下代码,以使用sevenZ类创建一个zip文件,希望它的压缩速度比常规的java zip更快。这就是我的代码的样子 我得到了这个错误,看起来很不相关 线程mainjava.lang.NoClassDefFoundError中的异常:org.tukaani.xz.FilterOptionsjava.lang.J9VMInternals.ver

  • 我正在使用commons-compress来处理tarball文件,并且注意到即使不是tar的文件似乎也会被处理。这是为什么--有没有更好的库来检测有效的tar文件 是一个CSV文件,测试失败,因为te.isFile()显然返回true。getName()似乎返回CSV的内容。这是不是我错误地使用了包的一个错误--我希望InputStream不能成功地转换为TarchiveEntry

  • 我正在开发一个从tar获取信息的软件。gz文件,我正在使用Apache commons压缩库。但我得到了以下错误: 样品焦油。使用的gz文件是eclipse-jee-luna-SR1-linux-gtk-x86_64.tar.gz 下面是使用 lib 的类:

  • 我正试图从压缩的csv文件中获取数据。有没有一种方法可以做到这一点,而不解压整个文件?如果没有,我如何解压文件并有效地读取它们?

  • 我在使用共享资源压缩库创建目录的tar.gz时遇到了一个问题。我有一个目录结构如下。 我正在使用以下代码进行压缩。它运行良好,无一例外。但是,当我尝试解压缩该 tar.gz时,我得到一个名为“子DirTo压缩”的文件。它的大小是正确的,因此文件在焦油过程中清楚地相互附加。所需的输出将是一个目录。我不知道我做错了什么。任何明智的共享资源压缩器都可以让我走上正确的道路吗?