You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by ja...@apache.org on 2017/12/13 13:38:55 UTC
ant git commit: BZ-19516 Use BufferedInputStream for reduced memory
usage in Zip task, in certain cases
Repository: ant
Updated Branches:
refs/heads/master 485b92fe7 -> 17f06a9f0
BZ-19516 Use BufferedInputStream for reduced memory usage in Zip task, in certain cases
Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/17f06a9f
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/17f06a9f
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/17f06a9f
Branch: refs/heads/master
Commit: 17f06a9f0f728f8346500bbea9f7fea33c3334fb
Parents: 485b92f
Author: Jaikiran Pai <ja...@gmail.com>
Authored: Tue Dec 12 16:52:26 2017 +0530
Committer: Jaikiran Pai <ja...@gmail.com>
Committed: Wed Dec 13 09:37:35 2017 +0530
----------------------------------------------------------------------
WHATSNEW | 5 ++
src/main/org/apache/tools/ant/taskdefs/Zip.java | 56 ++++++++------------
2 files changed, 27 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant/blob/17f06a9f/WHATSNEW
----------------------------------------------------------------------
diff --git a/WHATSNEW b/WHATSNEW
index 100b8bf..4f928a4 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -32,6 +32,11 @@ Fixed bugs:
up creating a new symlink under the target directory.
Bugzilla Report 58683
+ * Improvement to the Zip task for reduced memory usage in certain
+ cases. Thanks to Glen Lewis for reporting the issue and
+ suggesting the fix.
+ Bugzilla Report 19516
+
Other changes:
--------------
http://git-wip-us.apache.org/repos/asf/ant/blob/17f06a9f/src/main/org/apache/tools/ant/taskdefs/Zip.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java
index b4bb1dc..4fb7365 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Zip.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java
@@ -17,8 +17,7 @@
*/
package org.apache.tools.ant.taskdefs;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -1077,7 +1076,7 @@ public class Zip extends MatchingTask {
if (keepCompression) {
doCompress = (ze.getMethod() == ZipEntry.DEFLATED);
}
- try (InputStream is = zf.getInputStream(ze)) {
+ try (final BufferedInputStream is = new BufferedInputStream(zf.getInputStream(ze))) {
zipFile(is, zOut, prefix + name, ze.getTime(),
fromArchive, mode, ze.getExtraFields(true));
} finally {
@@ -1085,7 +1084,7 @@ public class Zip extends MatchingTask {
}
}
} else {
- try (InputStream is = r.getInputStream()) {
+ try (final BufferedInputStream is = new BufferedInputStream(r.getInputStream())) {
zipFile(is, zOut, prefix + name, r.getLastModified(),
fromArchive, mode, r instanceof ZipResource
? ((ZipResource) r).getExtraFields() : null);
@@ -1776,7 +1775,7 @@ public class Zip extends MatchingTask {
* @since Ant 1.5.2
* @throws IOException on error
*/
- protected void zipFile(InputStream in, final ZipOutputStream zOut, final String vPath,
+ protected void zipFile(final InputStream in, final ZipOutputStream zOut, final String vPath,
final long lastModified, final File fromArchive, final int mode)
throws IOException {
// fromArchive is used in subclasses overriding this method
@@ -1806,7 +1805,12 @@ public class Zip extends MatchingTask {
final ZipEntry ze = new ZipEntry(vPath);
ze.setTime(fixedModTime != null ? modTimeMillis : lastModified);
ze.setMethod(doCompress ? ZipEntry.DEFLATED : ZipEntry.STORED);
-
+ // if the input stream doesn't support mark/reset ability, we wrap it in a
+ // stream that adds that support.
+ // Note: We do *not* close this newly created wrapping input stream, since
+ // we don't "own" the underlying input stream that's passed to us and closing
+ // that is the responsibility of the caller.
+ final InputStream markableInputStream = in.markSupported() ? in : new BufferedInputStream(in);
/*
* ZipOutputStream.putNextEntry expects the ZipEntry to
* know its size and the CRC sum before you start writing
@@ -1817,31 +1821,15 @@ public class Zip extends MatchingTask {
if (!zOut.isSeekable() && !doCompress) {
long size = 0;
final CRC32 cal = new CRC32();
- if (!in.markSupported()) {
- // Store data into a byte[]
- final ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
- final byte[] buffer = new byte[BUFFER_SIZE];
- int count = 0;
- do {
- size += count;
- cal.update(buffer, 0, count);
- bos.write(buffer, 0, count);
- count = in.read(buffer, 0, buffer.length);
- } while (count != -1);
- in = new ByteArrayInputStream(bos.toByteArray());
-
- } else {
- in.mark(Integer.MAX_VALUE);
- final byte[] buffer = new byte[BUFFER_SIZE];
- int count = 0;
- do {
- size += count;
- cal.update(buffer, 0, count);
- count = in.read(buffer, 0, buffer.length);
- } while (count != -1);
- in.reset();
- }
+ markableInputStream.mark(Integer.MAX_VALUE);
+ final byte[] buffer = new byte[BUFFER_SIZE];
+ int count = 0;
+ do {
+ size += count;
+ cal.update(buffer, 0, count);
+ count = markableInputStream.read(buffer, 0, buffer.length);
+ } while (count != -1);
+ markableInputStream.reset();
ze.setSize(size);
ze.setCrc(cal.getValue());
}
@@ -1860,7 +1848,7 @@ public class Zip extends MatchingTask {
if (count != 0) {
zOut.write(buffer, 0, count);
}
- count = in.read(buffer, 0, buffer.length);
+ count = markableInputStream.read(buffer, 0, buffer.length);
} while (count != -1);
}
addedFiles.add(vPath);
@@ -1916,9 +1904,9 @@ public class Zip extends MatchingTask {
getLocation());
}
- try (InputStream fIn = Files.newInputStream(file.toPath())) {
+ try (final BufferedInputStream bIn = new BufferedInputStream(Files.newInputStream(file.toPath()))) {
// ZIPs store time with a granularity of 2 seconds, round up
- zipFile(fIn, zOut, vPath,
+ zipFile(bIn, zOut, vPath,
file.lastModified() + (roundUp ? ROUNDUP_MILLIS : 0),
null, mode);
}