我正在使用Apache Compress库来读取.tar.gz文件,如下所示:
final TarArchiveInputStream tarIn = initializeTarArchiveStream(this.archiveFile);
try {
TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
while (tarEntry != null) {
byte[] btoRead = new byte[1024];
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this!
int len = 0;
while ((len = tarIn.read(btoRead)) != -1) {
bout.write(btoRead, 0, len);
}
bout.close();
tarEntry = tarIn.getNextTarEntry();
}
tarIn.close();
}
catch (IOException e) {
e.printStackTrace();
}
是否有可能不将其提取到单独的文件中,并以某种方式在内存中读取它?也许变成一个巨大的String或什么?
答案 0 :(得分:6)
您可以使用ByteArrayOutputStream
替换文件流。
即。替换这个:
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this!
用这个:
ByteArrayOutputStream bout = new ByteArrayOutputStream();
然后在关闭bout
后,使用bout.toByteArray()
获取字节。
答案 1 :(得分:3)
是否有可能不将其提取到单独的文件中,并以某种方式在内存中读取它?也许变成一个巨大的String或什么?
是的确定。
只需替换内部循环中打开文件并使用写入ByteArrayOutputStream
...或一系列此类流的代码写入文件的代码。
从TAR读取的数据的自然表示(如此)将是字节/字节数组。如果字节是正确编码的字符,并且您知道正确的编码,那么您可以将它们转换为字符串。否则,最好将数据保留为字节。 (如果您尝试将非文本数据转换为字符串,或者如果使用错误的字符集/编码进行转换,则可能会破坏它......不可逆转。)
显然,你需要自己思考一些这些问题,但基本的想法应该有用......只要你有足够的堆空间。
答案 2 :(得分:0)
将btoread的值复制到类似
的字符串String s = String.valueof(byteVar);
和goon将字节值附加到字符串直到文件的末尾达到..