【问题标题】:Get specific file inputstream from TarArchiveInputStream从 TarArchiveInputStream 获取特定的文件输入流
【发布时间】:2021-03-01 05:13:27
【问题描述】:

我有一个 tar 文件,其中包含许多文件。我需要从 tar 文件中获取特定文件并从该文件中读取数据。

我正在使用下面的代码解压文件,我将使用其他函数读取这个返回的输入流。

 private  InputStream unTar(final File inputFile, final File outputDir) throws FileNotFoundException, IOException, ArchiveException {
        InputStream versionInputStream = null;
        final InputStream is = new FileInputStream(inputFile); 
        final TarArchiveInputStream debInputStream = (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is);
        TarArchiveEntry entry = null; 
        while ((entry = (TarArchiveEntry)debInputStream.getNextEntry()) != null) {
            if (!entry.isDirectory() && entry.getName().equals("version.txt")) {
                versionInputStream =  new FileInputStream(entry.getFile());
            }     
        }
        return versionInputStream;
    }

versionInputStream = new FileInputStream(entry.getFile()); 时出现空指针异常

我知道我们可以先将这个文件保存在目录中,然后再读取文件,但我不想把这个文件保存在目录中。

有没有什么方法可以在不将文件保存到某个目录的情况下读取此文件?

【问题讨论】:

    标签: java inputstream tar apache-commons-compress


    【解决方案1】:

    没有您阅读的档案条目的文件。 TarArchiveEntrygetFile 方法仅在使用 File-arg 构造函数创建条目时返回任何有用的信息,这仅在创建存档而不读取它时才有意义。

    您要查找的流是TarArchiveInputStream 本身,在您将其定位在您要阅读的条目之后,即

                if (!entry.isDirectory() && entry.getName().equals("version.txt")) {
                    versionInputStream = debInputStream;
                    break;
                }
    

    注意break

    尚未发布(还没有发布日期)Commons Compress 1.21 将包含一个新的 TarFile 类,该类提供对从可搜索源(如 File)读取的档案的随机访问和将使您的任务更方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多