Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Commons将写入从一个流压缩到另一个流挂起_Java_Android_Compression_Tar_Apache Commons - Fatal编程技术网

Java Apache Commons将写入从一个流压缩到另一个流挂起

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

我需要将一个tar档案重新打包到另一个。我知道ArchiveEntry已经是一个流了,所以我只是从一个流写到另一个流。这是我的密码:

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,所以最初的问题可能是您的缓冲区大小。您应该始终使用固定的缓冲区大小。