[
https://issues.apache.org/jira/browse/COMPRESS-198?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13429040#comment-13429040
]
Sebb commented on COMPRESS-198:
-------------------------------
Cannot access the test file; please attach the smallest possible example to the
issue.
Or, better yet, create the sample from the source tree as part of the test case.
Not sure the code example makes much sense.
The ZipArchiveInputStream stream already buffers internally.
It does not make sense to wrap it in a BufferedInputStream for each file.
> ZipArchiveInputStream truncates file in some condition
> ------------------------------------------------------
>
> Key: COMPRESS-198
> URL: https://issues.apache.org/jira/browse/COMPRESS-198
> Project: Commons Compress
> Issue Type: Bug
> Affects Versions: 1.4.1
> Reporter: phaphe
>
> ZipArchiveInputStream in some special situation truncates file silently
> without warning. The problem occurs when the source stream is a stream which
> does not support mark function and this stream is encapsulated in
> BufferedInputStream.
> This behaviour can be easily reproduced.
> The test code:
> {code:title=Test.java|borderStyle=solid}
> /**
> * Unzips test file and demonstrates the problem.
> *
> *
> */
> public class Test {
> /**
> * Silly Stream.
> * It simulates situation, when mark function is not supported.
> *
> */
> public static class SillyStream extends InputStream {
> FileInputStream source;
>
> public SillyStream(FileInputStream source) {
> this.source = source;
> }
> @Override
> public int read() throws IOException {
> return source.read();
> }
>
> @Override
> public void close() throws IOException {
> source.close();
> }
> }
> public static void main(String[] args) throws IOException {
> File exportDirectory = new File("out");
>
> FileInputStream fis = new FileInputStream("test.zip");
> //encapsulating with silly stream to simulate situation when mark
> function is not supported
> SillyStream ss = new SillyStream(fis);
> //encapsulating with buffered stream - Buffered stream supports mark
> function
> BufferedInputStream bs = new BufferedInputStream(ss,30000);
>
> ZipArchiveInputStream zip = new ZipArchiveInputStream(bs);
> ZipArchiveEntry entry;
> while ((entry = zip.getNextZipEntry()) != null) {
> File newFile = new File(
> exportDirectory.getAbsolutePath() + "/"
> + entry.getName());
> if (entry.isDirectory()) {
> createDir(newFile);
> continue;
> }
> createFile(newFile);
> FileOutputStream fos = new FileOutputStream(newFile);
> BufferedOutputStream bfos = new BufferedOutputStream(
> fos);
>
> //Buffered input stream is necessary there to simulate the
> //problem
> InputStream is = new BufferedInputStream(zip);
> int ch;
>
> //silly reading byte by byte
> while((ch = is.read()) != -1) {
> bfos.write(ch);
> }
>
> bfos.flush();
> bfos.close();
> }
> zip.close();
> }
> private static void createFile(File file) throws IOException {
> System.out.println("File:" + file.getAbsolutePath());
>
> File parent = file.getParentFile();
> parent.mkdirs();
>
> file.createNewFile();
> }
>
> private static void createDir(File file) throws IOException {
> System.out.println("Dir:" + file.getAbsolutePath());
> file.mkdirs();
> }
> }
> {code}
> The test file is there (300MB):
> http://uloz.to/x9kJLrt/test-zip
> The ZIP file was created by common compress.
> The problem can be found in file txt/1_0050.tif.txt. The real size is 4300
> bytes but after decompress with java code it has only 4240 bytes.
--
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