【问题标题】:Java TarInputStream read file names of a tar.gz file which included another tar.gz fileJava TarInputStream 读取包含另一个 tar.gz 文件的 tar.gz 文件的文件名
【发布时间】:2021-08-25 09:50:18
【问题描述】:

我正在尝试在另一个 tar.gz 文件中获取 tar.gz 文件的文件名。这是示例代码;

try (TarInputStream tis = getStreamRemoteTarGz(url)) { // accessing the first tar.gz file
    TarEntry e;
    while ((e = tis.getNextEntry()) != null) {
        if (e.getName().endsWith(".tar.gz")) {
             // accessing the inner tar.gz file (java.io.FileNotFoundException: inner_tar_file.tar.gz (No such file or directory))
             try (TarInputStream innerTis = new TarInputStream(new GZIPInputStream(new FileInputStream(entry.getName())))) {
                ....
        }
    }

结果,我得到了 FileNotFoundException: inner_tar_file.tar.gz。文件名 (inner_tar_file.tar.gz) 是正确的,我可以访问内部 tar.gz 文件的名称,但我想访问包含在此 tar.gz 文件中的文件名。如何使用 TarInputStream 访问内部 tar.gz 文件的文件名?

【问题讨论】:

  • 可能是不支持嵌套。不确定,但记得是这样的
  • 我可以在定义 TarInputStream 后进行内部操作。支持嵌套,因为第一个 try-catch 块工作正常,但我无法读取内部 tar.gz 文件的内容。

标签: java gzip tar gzipinputstream


【解决方案1】:

tar 文件的内容本身并不是一个文件。至少在java.io.File 的意义上不是,它直接在文件系统上表示真实的物理文件

java.io.File 代表任何可以用C:\somePath\myFile.ext(在Windows 上)或/home/user/somepath/myFile.ext(在大多数其他操作系统上)这样的路径来寻址的东西。没有这样的路径可以直接指向操作系统可以理解的.tar.gz中的条目。

无需创建新的FileInputStream,只需传入名为tisTarInputStream

【讨论】:

  • 呵呵。傻我没有滚动窗口看到FileInputStream
  • 谢谢,但这次我得到了“java.io.IOException:从输出缓冲区读取”的第一个while循环“....e = tis.getNextEntry())!= null) { ...."
  • 我怀疑这是因为 try-with-resources 将关闭所有内容,包括 tis。这很奇怪,但我认为在这种情况下你不应该关闭流。 TarInputStream 很奇怪,因为它代表 both 整个 TAR 流 单个条目的 InputStream。因此,如果您关闭它,您将关闭整个 TAR 流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多