You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2012/03/22 22:49:11 UTC

svn commit: r1304086 - in /commons/proper/io/trunk/src: changes/changes.xml main/java/org/apache/commons/io/IOUtils.java

Author: sebb
Date: Thu Mar 22 21:49:11 2012
New Revision: 1304086

URL: http://svn.apache.org/viewvc?rev=1304086&view=rev
Log:
IO-308 Allow applications to provide buffer (or size) for copyLarge methods.

Modified:
    commons/proper/io/trunk/src/changes/changes.xml
    commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java

Modified: commons/proper/io/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/changes/changes.xml?rev=1304086&r1=1304085&r2=1304086&view=diff
==============================================================================
--- commons/proper/io/trunk/src/changes/changes.xml (original)
+++ commons/proper/io/trunk/src/changes/changes.xml Thu Mar 22 21:49:11 2012
@@ -40,6 +40,10 @@ The <action> type attribute can be add,u
 
   <body>
     <release version="2.2" date="TBA" description="">
+      <!-- Note: the issue was not raised by Manoj, but arose from IO-305 and tests he performed -->
+      <action issue="IO-308" dev="sebb" type="add" due-to="Manoj Mokashi">
+        Allow applications to provide buffer (or size) for copyLarge methods.
+      </action>        
       <action issue="IO-311" dev="sebb" type="fix" due-to="Robert Muir">
         IOUtils.read(InputStream/Reader) ignores the offset parameter
       </action>        

Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java?rev=1304086&r1=1304085&r2=1304086&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java (original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java Thu Mar 22 21:49:11 2012
@@ -1449,7 +1449,27 @@ public class IOUtils {
      */
     public static long copyLarge(InputStream input, OutputStream output)
             throws IOException {
-        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
+        return copyLarge(input, output, new byte[DEFAULT_BUFFER_SIZE]);
+    }
+
+    /**
+     * Copy bytes from a large (over 2GB) <code>InputStream</code> to an
+     * <code>OutputStream</code>.
+     * <p>
+     * This method uses the provided buffer, so there is no need to use a
+     * <code>BufferedInputStream</code>.
+     * <p>
+     * 
+     * @param input  the <code>InputStream</code> to read from
+     * @param output  the <code>OutputStream</code> to write to
+     * @param buffer the buffer to use for the copy
+     * @return the number of bytes copied
+     * @throws NullPointerException if the input or output is null
+     * @throws IOException if an I/O error occurs
+     * @since 2.2
+     */
+    public static long copyLarge(InputStream input, OutputStream output, byte[] buffer)
+            throws IOException {
         long count = 0;
         int n = 0;
         while (EOF != (n = input.read(buffer))) {
@@ -1478,15 +1498,39 @@ public class IOUtils {
      * @throws IOException if an I/O error occurs
      * @since 2.2
      */
-    public static long copyLarge(InputStream input, OutputStream output, final long inputOffset, final long length)
+    public static long copyLarge(InputStream input, OutputStream output, long inputOffset, long length)
             throws IOException {
+        return copyLarge(input, output, inputOffset, length, new byte[DEFAULT_BUFFER_SIZE]);
+    }
+
+    /**
+     * Copy some or all bytes from a large (over 2GB) <code>InputStream</code> to an
+     * <code>OutputStream</code>, optionally skipping input bytes.
+     * <p>
+     * This method uses the provided buffer, so there is no need to use a
+     * <code>BufferedInputStream</code>.
+     * <p>
+     * 
+     * @param input  the <code>InputStream</code> to read from
+     * @param output  the <code>OutputStream</code> to write to
+     * @param inputOffset : number of bytes to skip from input before copying
+     *         -ve values are ignored
+     * @param length : number of bytes to copy. -ve means all
+     * @param buffer the buffer to use for the copy
+     *
+     * @return the number of bytes copied
+     * @throws NullPointerException if the input or output is null
+     * @throws IOException if an I/O error occurs
+     * @since 2.2
+     */
+    public static long copyLarge(InputStream input, OutputStream output, 
+            final long inputOffset, final long length, byte[] buffer)  throws IOException {
         if (inputOffset > 0) {
             skipFully(input, inputOffset);
         }
         if (length == 0) {
             return 0;
         }
-        final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
         final int bufferLength = buffer.length;
         int bytesToRead = bufferLength;
         if (length > 0 && length < bufferLength) {
@@ -1599,7 +1643,25 @@ public class IOUtils {
      * @since 1.3
      */
     public static long copyLarge(Reader input, Writer output) throws IOException {
-        char[] buffer = new char[DEFAULT_BUFFER_SIZE];
+        return copyLarge(input, output, new char[DEFAULT_BUFFER_SIZE]);
+    }
+
+    /**
+     * Copy chars from a large (over 2GB) <code>Reader</code> to a <code>Writer</code>.
+     * <p>
+     * This method uses the provided buffer, so there is no need to use a
+     * <code>BufferedReader</code>.
+     * <p>
+     *
+     * @param input  the <code>Reader</code> to read from
+     * @param output  the <code>Writer</code> to write to
+     * @param buffer the buffer to be used for the copy
+     * @return the number of characters copied
+     * @throws NullPointerException if the input or output is null
+     * @throws IOException if an I/O error occurs
+     * @since 2.2
+     */
+    public static long copyLarge(Reader input, Writer output, char [] buffer) throws IOException {
         long count = 0;
         int n = 0;
         while (EOF != (n = input.read(buffer))) {
@@ -1630,13 +1692,36 @@ public class IOUtils {
      */
     public static long copyLarge(Reader input, Writer output, final long inputOffset, final long length)
             throws IOException {
+        return  copyLarge(input, output, inputOffset, length, new char[DEFAULT_BUFFER_SIZE]);
+    }
+
+    /**
+     * Copy some or all chars from a large (over 2GB) <code>InputStream</code> to an
+     * <code>OutputStream</code>, optionally skipping input chars.
+     * <p>
+     * This method uses the provided buffer, so there is no need to use a
+     * <code>BufferedReader</code>.
+     * <p>
+     * 
+     * @param input  the <code>Reader</code> to read from
+     * @param output  the <code>Writer</code> to write to
+     * @param inputOffset : number of chars to skip from input before copying
+     *         -ve values are ignored
+     * @param length : number of chars to copy. -ve means all
+     * @param buffer the buffer to be used for the copy
+     * @return the number of chars copied
+     * @throws NullPointerException if the input or output is null
+     * @throws IOException if an I/O error occurs
+     * @since 2.2
+     */
+    public static long copyLarge(Reader input, Writer output, final long inputOffset, final long length, char [] buffer)
+            throws IOException {
         if (inputOffset > 0) {
             skipFully(input, inputOffset);
         }
         if (length == 0) {
             return 0;
         }
-        char[] buffer = new char[DEFAULT_BUFFER_SIZE];
         int bytesToRead = buffer.length;
         if (length > 0 && length < buffer.length) {
             bytesToRead = (int) length;