如何将ArchiveEntry转换为InputStream?

7

我正在使用以下代码读取一个tar.gz归档文件:

ArchiveEntry entry = tarArchiveInputStream.getNextEntry();

问题:我该如何将这个ArchiveEntry转换为一个InputStream,以便我可以实际读取和处理文件到一个String中?


请澄清一下,您是指来自Apache的commons-compress中的org.apache.commons.compress.archivers.ArchiveEntry吗? - MWiesner
2
是的,我指的是commons.compress。 - membersound
3个回答

4

它已经是一个InputStream了。

byte[] buf = new byte[(int) entry.getSize()];
int k = tarArchiveInputStream.read(buf, 0, buf.length);
String s = new String(buf, 0, k);

4
你可以使用IOUtils完全读取InputStream:
import org.apache.commons.compress.utils.IOUtils

byte[] buf = new byte[(int) entry.getSize()];
int readed  = IOUtils.readFully(tarArchiveInputStream,buf);

//readed should equal buffer size
if(readed != buf.length) {
 throw new RuntimeException("Read bytes count and entry size differ");
}

String string = new String(buf, StandardCharsets.UTF_8);

如果您的文件编码不是utf-8,请在字符串构造函数中使用该编码而不是utf-8。


1
这可能是正确的解决方案,因为IOUtils.readFully可以直接从commons.compress中使用。 - membersound

3

如果您真的想逐个读取文件,TarEntry实际上在其中保存了File对象:

这个类表示Tar归档中的一个条目。它由条目的头部和条目的File组成。

因此,只需初始化另一个FileInputStream即可:

import org.apache.commons.io.IOUtils;
String file = IOUtils.toString(new FileInputStream(entry.getFile());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接