Author: bodewig Date: Tue Aug 25 08:50:37 2009 New Revision: 807523 URL: http://svn.apache.org/viewvc?rev=807523&view=rev Log: Use NIO when copying files without filtering. PR 30094. Submitted by J Bleijenbergh and Robin Verduijn
Modified: ant/core/trunk/CONTRIBUTORS ant/core/trunk/WHATSNEW ant/core/trunk/contributors.xml ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java Modified: ant/core/trunk/CONTRIBUTORS URL: http://svn.apache.org/viewvc/ant/core/trunk/CONTRIBUTORS?rev=807523&r1=807522&r2=807523&view=diff ============================================================================== Binary files - no diff available. Modified: ant/core/trunk/WHATSNEW URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=807523&r1=807522&r2=807523&view=diff ============================================================================== --- ant/core/trunk/WHATSNEW (original) +++ ant/core/trunk/WHATSNEW Tue Aug 25 08:50:37 2009 @@ -905,6 +905,10 @@ a property to the number of rows affected by a task execution. Bugzilla Report 40923. + * when Ant copies files without filtering, it will now use NIO + channels. + Bugzilla Report 30094. + Changes from Ant 1.7.0 TO Ant 1.7.1 ============================================= Modified: ant/core/trunk/contributors.xml URL: http://svn.apache.org/viewvc/ant/core/trunk/contributors.xml?rev=807523&r1=807522&r2=807523&view=diff ============================================================================== --- ant/core/trunk/contributors.xml (original) +++ ant/core/trunk/contributors.xml Tue Aug 25 08:50:37 2009 @@ -519,6 +519,10 @@ <last>Ivanov</last> </name> <name> + <first>J</first> + <last>Bleijenbergh</last> + </name> + <name> <first>Jack</first> <middle>J.</middle> <last>Woehr</last> @@ -1067,6 +1071,10 @@ <last>Green</last> </name> <name> + <first>Robin</first> + <last>Verduijn</last> + </name> + <name> <first>Rob</first> <last>Oxspring</last> </name> Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java?rev=807523&r1=807522&r2=807523&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java Tue Aug 25 08:50:37 2009 @@ -17,19 +17,22 @@ */ package org.apache.tools.ant.util; -import java.io.File; -import java.io.Reader; -import java.io.InputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.OutputStreamWriter; -import java.io.BufferedInputStream; +import java.io.Reader; +import java.nio.channels.FileChannel; import java.util.Arrays; -import java.util.Vector; import java.util.Iterator; +import java.util.Vector; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectComponent; @@ -433,6 +436,45 @@ FileUtils.close(out); FileUtils.close(in); } + } else if (source.as(FileProvider.class) != null + && dest.as(FileProvider.class) != null) { + File sourceFile = + ((FileProvider) source.as(FileProvider.class)).getFile(); + File destFile = + ((FileProvider) dest.as(FileProvider.class)).getFile(); + + File parent = destFile.getParentFile(); + if (parent != null && !parent.isDirectory() + && !destFile.getParentFile().mkdirs()) { + throw new IOException("failed to create the parent directory" + + " for " + destFile); + } + + FileInputStream in = null; + FileOutputStream out = null; + FileChannel srcChannel = null; + FileChannel destChannel = null; + + try { + in = new FileInputStream(sourceFile); + out = new FileOutputStream(destFile); + + srcChannel = in.getChannel(); + destChannel = out.getChannel(); + + long position = 0; + long count = srcChannel.size(); + while (position < count) { + position += + srcChannel.transferTo(position, FileUtils.BUF_SIZE, + destChannel); + } + } finally { + FileUtils.close(srcChannel); + FileUtils.close(destChannel); + FileUtils.close(out); + FileUtils.close(in); + } } else { InputStream in = null; OutputStream out = null;