我有一个tar.gz文件的字节数组表示。我想在添加新的配置文件后获得新tar.gz文件的字节数组表示形式。我希望完全在代码本身中完成这项工作,而不在本地磁盘上创建任何文件。
下面是我用java编写的代码
InputStream fIn = new ByteArrayInputStream(inputBytes);
BufferedInputStream in = new BufferedInputStream(fIn);
GzipCompressorInputStream gzIn = new GzipCompressorInputStream(in);
TarArchiveInputStream tarInputStream = new TarArchiveInputStream(gzIn);
ByteArrayOutputStream fOut = new ByteArrayOutputStream();
BufferedOutputStream buffOut = new BufferedOutputStream(fOut);
GzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(buffOut);
TarArchiveOutputStream tarOutputStream = new TarArchiveOutputStream(gzOut);
ArchiveEntry nextEntry;
while ((nextEntry = tarInputStream.getNextEntry()) != null) {
tarOutputStream.putArchiveEntry(nextEntry);
IOUtils.copy(tarInputStream, tarOutputStream);
tarOutputStream.closeArchiveEntry();
}
tarInputStream.close();
createTarArchiveEntry("config.json", configData, tarOutputStream);
tarOutputStream.finish();
// Convert tarOutputStream to byte array and return
private static void createTarArchiveEntry(String fileName, byte[] configData, TarArchiveOutputStream tOut)
throws IOException {
ByteArrayInputStream baOut1 = new ByteArrayInputStream(configData);
TarArchiveEntry tarEntry = new TarArchiveEntry(fileName);
tarEntry.setSize(configData.length);
tOut.putArchiveEntry(tarEntry);
byte[] buffer = new byte[1024];
int len;
while ((len = baOut1.read(buffer)) > 0) {
tOut.write(buffer, 0, len);
}
tOut.closeArchiveEntry();
}
如何将tarouputstream转换为字节数组?
1条答案
按热度按时间2vuwiymt1#
你已经打开了好几个
OutputStream
示例,但您尚未关闭它们。或者更准确地说,您没有“刷新”内容,特别是BufferedOutputStream
例如。BufferedOutputStream
正在使用内部缓冲区“等待”写入目标的数据OutputStream
. 直到有理由这样做,它才会这样做。其中一个“原因”是打电话给BufferedOutputStream.flush()
方法:public void flush() throws IOException
刷新此缓冲输出流。这将强制将任何缓冲输出字节写入底层输出流。另一个“原因”是关闭流,以便在关闭流之前写入剩余字节。
在您的情况下,正在写入的字节仍然存储在内部缓冲区中。根据您的代码结构,您可以简单地关闭所有
OutputStream
示例,因此字节最终被写入ByteArrayOutputStream
: