[ https://issues.apache.org/jira/browse/COMPRESS-160?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stefan Bodewig resolved COMPRESS-160. ------------------------------------- Resolution: Fixed Fix Version/s: 1.3 fixed with svn revision 1187874 > TarArchiveOutputStream.getBytesWritten() returns invalid value > -------------------------------------------------------------- > > Key: COMPRESS-160 > URL: https://issues.apache.org/jira/browse/COMPRESS-160 > Project: Commons Compress > Issue Type: Bug > Components: Archivers > Affects Versions: 1.2 > Environment: java.runtime.name=Java(TM) SE Runtime Environment > java.runtime.version=1.6.0_27-b07 > os.arch=x86 > os.name=Windows 7 > os.version=6.1 > This issue may be unrelated to environment > Reporter: Robert Simac > Fix For: 1.3 > > > It appears the TarArchiveOutputStream.getBytesWritten()returns zero or > invalid value when queried. > In the code sample below, it returns zero, even after an sizeable file was > processed. > I've printed it twice, once before closing the output stream, and once after, > just for the reference. > It is also demonstrable on multiple processed files. > Within the TarArchiveOutputStream.getBytesWritten() implementation, it > appears the call for count(numToWrite) is made after the numToWrite is > depleted in the process of actual byte writing. When call for > count(numToWrite); is moved up, the returned values for > TarArchiveOutputStream.getBytesWritten() are getting equal to the sum of the > sizes of processed files. This is much closer to expected value ("Returns the > current number of bytes written to this stream.") but still not correct, for > that number should include the tar header sizes as well. > At any rate, please find the proposed patch below, merely moving > count(numToWrite); up a few lines. This makes > TarArchiveOutputStream.getBytesWritten() closer to true value. > Test code: > {code} > @Test > public void tartest() throws Exception { > > FileOutputStream myOutputStream = new > FileOutputStream("C:/temp/tartest.tar"); > > ArchiveOutputStream sTarOut = new > ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.TAR, > myOutputStream); > > File sSource = new File("C:/share/od_l.txt"); > TarArchiveEntry sEntry = new TarArchiveEntry(sSource); > sTarOut.putArchiveEntry(sEntry); > > FileInputStream sInput = new FileInputStream(sSource); > byte[] cpRead = new byte[8192]; > > int iRead = 0; > while ((iRead = sInput.read(cpRead)) > 0) { > sTarOut.write(cpRead, 0, iRead); > } > > sLog.info("Processed: "+sTarOut.getBytesWritten()+" bytes. File > Len: "+sSource.length()); > > sInput.close(); > sTarOut.closeArchiveEntry(); > sTarOut.close(); > sLog.info("Processed: "+sTarOut.getBytesWritten()+" bytes. File > Len: "+sSource.length()); > > return; > > } > {code} > Test Output: > {code} > Oct 21, 2011 9:09:28 AM com.cronsult.jndmpd.test.Backup tartest > INFO: Processed: 0 bytes. File Len: 186974208 > Oct 21, 2011 9:09:28 AM com.cronsult.jndmpd.test.Backup tartest > INFO: Processed: 0 bytes. File Len: 186974208 > {code} > Proposed Patch: > {code} > Index: > src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java > =================================================================== > --- > src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java > (revision 1187150) > +++ > src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java > (working copy) > @@ -276,6 +276,8 @@ > // eliminate some of the buffer copying. > // > } > + > + count(numToWrite); > > if (assemLen > 0) { > if ((assemLen + numToWrite) >= recordBuf.length) { > @@ -325,7 +327,7 @@ > wOffset += num; > } > > - count(numToWrite); > + > } > > /** > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira