Java 如何使用Commons Compress对文件进行tar,该文件太大并导致内存不足崩溃?

Java 如何使用Commons Compress对文件进行tar,该文件太大并导致内存不足崩溃?,java,tar,apache-commons,Java,Tar,Apache Commons,在下面的代码中,如果我给(Apache)Commons压缩一个数GB大小的文件,它将崩溃,因为它会耗尽我所有的内存 我能让它一次读一次,然后写一小段文件吗?我一直在研究分块,但我不确定如何做到这一点,以便在将这些分块写入.tar格式后将文件放回一起 处理任何大小的支持文件的最佳方法是什么 FileOutputStream fileOutputStream = new FileOutputStream("output.tar"); BufferedOutputStream bufferedOutp

在下面的代码中,如果我给(Apache)Commons压缩一个数GB大小的文件,它将崩溃,因为它会耗尽我所有的内存

我能让它一次读一次,然后写一小段文件吗?我一直在研究分块,但我不确定如何做到这一点,以便在将这些分块写入.tar格式后将文件放回一起

处理任何大小的支持文件的最佳方法是什么

FileOutputStream fileOutputStream = new FileOutputStream("output.tar");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
GzipCompressorOutputStream gzipOutputStream = new GzipCompressorOutputStream(bufferedOutputStream);
TarArchiveOutputStream tarArchiveOutputStream = new TarArchiveOutputStream(gzipOutputStream)) {

tarArchiveOutputStream.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);
tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);

File currentFile = new File("Huge_MultiGB_File.txt");
String relativeFilePath = currentFile.getPath();
TarArchiveEntry tarEntry = new TarArchiveEntry(currentFile, relativeFilePath);
tarEntry.setSize(currentFile.length());
tarArchiveOutputStream.putArchiveEntry(tarEntry);
tarArchiveOutputStream.write(IOUtils.toByteArray(new FileInputStream(currentFile)));
tarArchiveOutputStream.closeArchiveEntry();

您必须写入文件的一小部分并将其写入循环中输出,而不是首先使用
IOUtils将整个文件读取到内存中

大致是这样做的:

FileInputStream source=new FileInputStream(....somefile);
tarArchiveOutputStream; prepared to w writing

byte[] buff = new byte[1024*10]; //10kb buff
int numBytesRead = -1; //number of bytes read


while(( numBytesRead = source.read(buff)) > 0 ) {
    // while source has bytes, read from source and write
    // the same number of bytes to the tar outputstream
    tarArchiveOutputStream.write(buff, 0, numBytesRead);
   }
}

什么是tarArchiveOutputStream?我已经添加了该代码。好的,我会尝试找到一些例子。如果您有任何示例代码如何做到这一点,请随意分享。我是java新手,对文件不熟悉。这是一种非常常见的情况。我只是不知道如何使用Apache来实现这一点。该代码将输入文件作为参数,目标文件作为参数。我如何告诉它循环并同时写入文件的小部分?