从 TarArchiveInputStream 获取特定文件输入流

问题描述

我有一个 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()); 时出现空指针异常

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

有什么方法可以读取这个文件而不将文件保存到某个目录吗?

解决方法

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

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

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

注意 break

尚未发布(尚未发布)Commons Compress 1.21 将包含一个新的 TarFile 类,该类提供对从可查找源(如 {{1 }}) 并将使您的任务更方便。