[ 
https://issues.apache.org/jira/browse/COMPRESS-457?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16526027#comment-16526027
 ] 

Stefan Bodewig commented on COMPRESS-457:
-----------------------------------------

I  have to disagree. This is {{closeArchiveEntry}} throwing an exception 
because you are about to create an invalid archive. I know that you don't care 
in your situation, but IMHO it is totally in line with the contract of the 
method to throw in this case.

The thing that we might want to do is modify {{close}} to close the underlying 
stream even if there is an error in {{finish}}. But this would be a change 
across a lot of formats (I just checked zip, 7z, cpio and ar and all behave the 
same way) and I'd take that as a discussion to the dev list.

The best thing you can do is to keep a reference to the stream you pass to 
{{TarArchiveOutputStream}}'s constructor and close that underlying stream 
yourself.

 

> When there is no space in the disk,the method closeArchiveEntry() cannot work
> -----------------------------------------------------------------------------
>
>                 Key: COMPRESS-457
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-457
>             Project: Commons Compress
>          Issue Type: Bug
>          Components: Compressors
>    Affects Versions: 1.16, 1.17
>         Environment: all are environment can recurring this problems
>            Reporter: zhangxinyue
>            Priority: Major
>
> When there is no space in the disk,I want  to delete the Compressed half 
> file, in my code,I close  the archiveEntry use method closeArchiveEntry() of 
> the TarArchiveOutputStream class,but because follow code 
> fragments,closeArchiveEntry() is not work,I cannoot close io stream 
> TarArchiveOutputStream,so that the tmp *.tar.gz cannot be delete.
> {code:java}
> // code placeholder
> public void closeArchiveEntry() throws IOException {
>     if (this.finished) {
>         throw new IOException("Stream has already been finished");
>     } else if (!this.haveUnclosedEntry) {
>         throw new IOException("No current entry to close");
>     } else {
>         this.out.flushBlock();
>         if (this.currBytes < this.currSize) {
>             throw new IOException("entry '" + this.currName + "' closed at '" 
> + this.currBytes + "' before the '" + this.currSize + "' bytes specified in 
> the header were written");
>         } else {
>             this.recordsWritten = (int)((long)this.recordsWritten + 
> this.currSize / 512L);
>             if (0L != this.currSize % 512L) {
>                 ++this.recordsWritten;
>             }
>             this.haveUnclosedEntry = false;
>         }
>     }
> }
> {code}
> I think this is a bug, when closeArchiveEntry() called,should not throw the 
> follow  IOException("entry '" + this.currName + "' closed at '" + 
> this.currBytes + "' before the '" + this.currSize + "' bytes specified in the 
> header were written").
> {code:java}
> // code placeholder
> if (this.currBytes < this.currSize)
> { throw new IOException("entry '" + this.currName + "' closed at '" + 
> this.currBytes + "' before the '" + this.currSize + "' bytes specified in the 
> header were written"); }
> {code}
>  
> Please help, thk!!!



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to