如何将tararchiveoutputstream转换为字节数组而不保存到文件系统中

ctehm74n  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(756)

我有一个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转换为字节数组?

2vuwiymt

2vuwiymt1#

你已经打开了好几个 OutputStream 示例,但您尚未关闭它们。或者更准确地说,您没有“刷新”内容,特别是 BufferedOutputStream 例如。 BufferedOutputStream 正在使用内部缓冲区“等待”写入目标的数据 OutputStream . 直到有理由这样做,它才会这样做。其中一个“原因”是打电话给 BufferedOutputStream.flush() 方法: public void flush() throws IOException 刷新此缓冲输出流。这将强制将任何缓冲输出字节写入底层输出流。
另一个“原因”是关闭流,以便在关闭流之前写入剩余字节。
在您的情况下,正在写入的字节仍然存储在内部缓冲区中。根据您的代码结构,您可以简单地关闭所有 OutputStream 示例,因此字节最终被写入 ByteArrayOutputStream :

tarInputStream.close();
createTarArchiveEntry("config.json", configData, tarOutputStream);
tarOutputStream.finish();
// Convert tarOutputStream to byte array and return
tarOutputStream.close();
gzOut.close();
buffOut.close();
fOut.close();

byte[] content = fOut.toByteArray();

相关问题