Home | History | Annotate | Download | only in misc
      1 /*
      2  * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 /**
     27  * IOUtils: A collection of IO-related public static methods.
     28  */
     29 
     30 package sun.misc;
     31 
     32 import java.io.EOFException;
     33 import java.io.IOException;
     34 import java.io.InputStream;
     35 import java.util.Arrays;
     36 
     37 public class IOUtils {
     38 
     39     /**
     40      * Read up to <code>length</code> of bytes from <code>in</code>
     41      * until EOF is detected.
     42      * @param in input stream, must not be null
     43      * @param length number of bytes to read, -1 or Integer.MAX_VALUE means
     44      *        read as much as possible
     45      * @param readAll if true, an EOFException will be thrown if not enough
     46      *        bytes are read. Ignored when length is -1 or Integer.MAX_VALUE
     47      * @return bytes read
     48      * @throws IOException Any IO error or a premature EOF is detected
     49      */
     50     public static byte[] readFully(InputStream is, int length, boolean readAll)
     51             throws IOException {
     52         byte[] output = {};
     53         if (length == -1) length = Integer.MAX_VALUE;
     54         int pos = 0;
     55         while (pos < length) {
     56             int bytesToRead;
     57             if (pos >= output.length) { // Only expand when there's no room
     58                 bytesToRead = Math.min(length - pos, output.length + 1024);
     59                 if (output.length < pos + bytesToRead) {
     60                     output = Arrays.copyOf(output, pos + bytesToRead);
     61                 }
     62             } else {
     63                 bytesToRead = output.length - pos;
     64             }
     65             int cc = is.read(output, pos, bytesToRead);
     66             if (cc < 0) {
     67                 if (readAll && length != Integer.MAX_VALUE) {
     68                     throw new EOFException("Detect premature EOF");
     69                 } else {
     70                     if (output.length != pos) {
     71                         output = Arrays.copyOf(output, pos);
     72                     }
     73                     break;
     74                 }
     75             }
     76             pos += cc;
     77         }
     78         return output;
     79     }
     80 }
     81