从 TarArchiveInputStream 获取特定文件输入流
Get specific file inputstream from TarArchiveInputStream
我有一个 tar 文件,其中包含许多文件。我需要从 tar 文件中获取特定文件并从该文件中读取数据。
我正在使用以下代码取消taring 文件,我将使用其他函数读取此返回的输入流。
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());
时出现空指针异常
我知道我们可以先将这个文件保存在目录中,然后再读取文件,但我不想将这个文件保存在目录中。
有什么方法可以在不将文件保存到某个目录的情况下读取该文件?
没有您阅读的存档条目的文件。 TarArchiveEntry
的 getFile
方法仅 returns 当使用 File
-arg 构造函数创建条目时有用的任何东西,这仅在创建存档而不读取它时才有意义。
您要查找的流是 TarArchiveInputStream
本身,在您将其定位到您要阅读的条目后,即
if (!entry.isDirectory() && entry.getName().equals("version.txt")) {
versionInputStream = debInputStream;
break;
}
注意 break
。
尚未发布(还没有发布日期)的 Commons Compress 1.21 将包含一个新的 TarFile
class,它提供对从可搜索源读取的档案的随机访问(如 File
),将使您的任务更加方便。
我有一个 tar 文件,其中包含许多文件。我需要从 tar 文件中获取特定文件并从该文件中读取数据。
我正在使用以下代码取消taring 文件,我将使用其他函数读取此返回的输入流。
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());
我知道我们可以先将这个文件保存在目录中,然后再读取文件,但我不想将这个文件保存在目录中。
有什么方法可以在不将文件保存到某个目录的情况下读取该文件?
没有您阅读的存档条目的文件。 TarArchiveEntry
的 getFile
方法仅 returns 当使用 File
-arg 构造函数创建条目时有用的任何东西,这仅在创建存档而不读取它时才有意义。
您要查找的流是 TarArchiveInputStream
本身,在您将其定位到您要阅读的条目后,即
if (!entry.isDirectory() && entry.getName().equals("version.txt")) {
versionInputStream = debInputStream;
break;
}
注意 break
。
尚未发布(还没有发布日期)的 Commons Compress 1.21 将包含一个新的 TarFile
class,它提供对从可搜索源读取的档案的随机访问(如 File
),将使您的任务更加方便。