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

在 java 中循环访问 tar.gz [重复]

凌永逸
2023-03-14

我有一个tar.gz文件,里面有大量的小xml文件(略少于1.5m)(没有子目录)。现在我想遍历这些文件,我正在尝试使用apache公共压缩来实现这一点。我不想像在类似主题中经常看到的那样输出或写入任何东西到新文件中。我只想逐步读取信息(完美的是能够在某个点停止并继续运行另一个程序,但那是次要的)。

因此,对于初学者,我认为我应该从这样的事情开始(计数器只是为了测试目的而存在以减少时间):

public static void readTar(String in) throws IOException {
    try (TarArchiveInputStream tarArchiveInputStream =
                 new TarArchiveInputStream(
                         new BufferedInputStream(
                                 new GzipCompressorInputStream(
                                         new FileInputStream(in))))){
        TarArchiveEntry entry;
        int counter = 0;
        while ((entry = tarArchiveInputStream.getNextTarEntry()) != null && counter < 1000) {
            counter++;
            System.out.println(entry.getFile());
        }
    }
}

但是entry.getFile()的结果总是null,所以我不能处理它的内容,而entry.getName()返回预期的结果。

如果有人能指出我的错误,我会很高兴的。

共有1个答案

颜熙云
2023-03-14

getFile方法的解释基本上说它对从存档中读取的条目没有用。

https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/tar/TarArchiveEntry.html#getFile--

我认为您需要使用“阅读”:

https://commons.apache.org/proper/commons-compress/javadocs/api-1.18/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.html#read-byte:A-int-int-

在弄清楚库是如何工作的时,我要做的另一件事是,我将链接源代码并查看库代码,以了解引擎盖下实际发生了什么。

 类似资料:
  • 我有一个特殊的问题,当在数组中分配循环中的元素时,事情发生得很好。 当我移出循环并进行检查时,所有索引的相同数组值将设置为最后一个索引的数组值。下面是代码 当我打印的这基本上是在循环值显示正确.的时刻执行出来并检查"outside_loop"的值成为dataModelCollection[6]. getName()-这是最后一个索引的值.相同是、、的情况。 不知道我哪里错了。 无论它的价值在这里是

  • 我试图制作一个图形用户界面,不断绘制从微处理器接收的信号。我试图通过只使用类来实现这一点,但是失败了,因为只有GUI类是oppend。现在我已经实现了线程(或者至少我认为我有!?)但是每个线程只运行一次。这让我相信我不明白tkinter中的主循环是如何工作的,所以我可以重新编写我的代码,让线程变得活跃吗? 我希望你们中的一些人能帮助我把这段代码变成一个实时更新绘图的程序。 但是它仍然没有更新plo

  • 下面是我的代码 错误:我在封闭范围中定义的局部变量必须是最终的或实际上是最终的

  • 问题内容: 看到: 问题在于,警报的item.id始终是数组中最后一个项目的ID(this.items)。怎么解决? 问题答案: 这里的问题是变量随每个循环而变化。在以后参考时,将使用其保留的最后一个值。您可以使用一种称为闭包的技术(本质上是一个返回函数的函数)来快速确定变量的范围。 旁注我看到您在这里有jQuery。它具有可以与数组一起使用的辅助函数,并且可以作为简单的for/each循环的快捷

  • 我已经创建了一个字符串数组,其中包含单词“磅”、“美元”和“欧元”,我想把这些标签放在旗帜的左边(为了用户应用程序的清晰性,因为不是每个用户都知道哪个货币属于哪个国家)。 我创建了一个循环,将创建一个标签,并将其分配到旗帜的左侧,它应该使一个"英镑"标签,然后一个"美元",然后一个"欧元"每次穿越Y轴南部,使他们与旗帜对齐然后,它将重置数组计数以返回到正确的字符串,沿着x轴移动并再次重复。然而,它

  • 我一直得到一个错误,但我不明白为什么。这个错误是关于不能从double转换成int,但是我把所有东西都声明成double,所以我不明白为什么会出现这个错误。