Java Apache Commons将写入从一个流压缩到另一个流挂起
我需要将一个tar档案重新打包到另一个。我知道ArchiveEntry已经是一个流了,所以我只是从一个流写到另一个流。这是我的密码:Java Apache Commons将写入从一个流压缩到另一个流挂起,java,android,compression,tar,apache-commons,Java,Android,Compression,Tar,Apache Commons,我需要将一个tar档案重新打包到另一个。我知道ArchiveEntry已经是一个流了,所以我只是从一个流写到另一个流。这是我的密码: public void repack (String sourceFile, String destFile) throws IOException { TarArchiveInputStream tarIn = new TarArchiveInputStream (new BufferedInputStream (new FileInputStream
public void repack (String sourceFile, String destFile) throws IOException {
TarArchiveInputStream tarIn = new TarArchiveInputStream (new BufferedInputStream (new FileInputStream (sourceFile)));
TarArchiveOutputStream tarOut = new TarArchiveOutputStream (new FileOutputStream (destFile));
TarArchiveEntry tarEntry;
while ((tarEntry = tarIn.getNextTarEntry ()) != null) {
tarOut.putArchiveEntry (tarEntry);
if (tarEntry.isFile ()) {
int counter;
byte byteData[] = new byte[(int) tarEntry.getSize()];
while ((counter = tarIn.read (byteData, 0, byteData.length)) != -1)
tarOut.write (byteData, 0, counter);
}
tarOut.closeArchiveEntry ();
}
tarIn.close ();
tarOut.flush ();
tarOut.close ();
}
它没有显示错误,只是挂断了。什么是可能的问题?提前谢谢 认为最好的方法是使用
IOUtils.copy(tarIn,tarOut)代码>,我刚刚将代码的循环部分更改为
if (tarEntry.isFile ())
IOUtils.copy (tarIn, tarOut);
可能使用>0
而不是!=-1
@F43nd1r谢谢,但是不,流总是以0开头,而不是1,所以0是-1,不是0。与数组相同。通过使用IOUtils.copy(tarIn,tarOut)更改循环来解决问题代码>返回读取的字节数。0是此处的有效返回值,这将导致循环无限运行。返回值未引用索引。流可以使用-1作为返回值,也可以不使用-1作为返回值来指示流的大小。但是,由于IOUtils正在工作,它也使用-1,所以最初的问题可能是您的缓冲区大小。您应该始终使用固定的缓冲区大小。