Uploaded image for project: 'Commons IO'
  1. Commons IO
  2. IO-400

IOUtils: add support for copying from large byte buffers

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Closed
    • Major
    • Resolution: Duplicate
    • None
    • 2.5
    • None
    • None

    Description

      Trying to write a large byte array to a FileOutputStream may cause OOME.

      This is because such output requires the use of native code, and native code may need to copy the array in order to access it safely, see:

      http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp1265

      It might therefore be useful to have a method which writes from the byte array in chunks. One can create a ByteArrayInputStream from the input, and then use one of the copy() methods, but that creates an unnecessary array buffer (albeit only 4k).

      There are already write methods which copy byte[] to OutputStream and char[] to Writer.

      Some or all of these could be converted to use chunked output, or there could be new methods to implement the chunking.

      Here is a sample implementation of a stand-alone method:

      public static void writeChunked(byte[] data, OutputStream output) throws IOException {
          int bytes = data.length;
          int offset = 0;
          while(bytes > 0) {
              int chunk = Math.min(bytes, DEFAULT_BUFFER_SIZE);
              output.write(data, offset, chunk);
              bytes -= chunk;
              offset += chunk;
          }
      }
      

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              sebb Sebb
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: