rt/emul/compact/src/main/java/java/io/BufferedOutputStream.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 26 Feb 2013 16:54:16 +0100
changeset 772 d382dacfd73f
parent 682 emul/compact/src/main/java/java/io/BufferedOutputStream.java@5d25a1df3540
permissions -rw-r--r--
Moving modules around so the runtime is under one master pom and can be built without building other modules that are in the repository
     1 /*
     2  * Copyright (c) 1994, 2003, 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 package java.io;
    27 
    28 /**
    29  * The class implements a buffered output stream. By setting up such
    30  * an output stream, an application can write bytes to the underlying
    31  * output stream without necessarily causing a call to the underlying
    32  * system for each byte written.
    33  *
    34  * @author  Arthur van Hoff
    35  * @since   JDK1.0
    36  */
    37 public
    38 class BufferedOutputStream extends FilterOutputStream {
    39     /**
    40      * The internal buffer where data is stored.
    41      */
    42     protected byte buf[];
    43 
    44     /**
    45      * The number of valid bytes in the buffer. This value is always
    46      * in the range <tt>0</tt> through <tt>buf.length</tt>; elements
    47      * <tt>buf[0]</tt> through <tt>buf[count-1]</tt> contain valid
    48      * byte data.
    49      */
    50     protected int count;
    51 
    52     /**
    53      * Creates a new buffered output stream to write data to the
    54      * specified underlying output stream.
    55      *
    56      * @param   out   the underlying output stream.
    57      */
    58     public BufferedOutputStream(OutputStream out) {
    59         this(out, 8192);
    60     }
    61 
    62     /**
    63      * Creates a new buffered output stream to write data to the
    64      * specified underlying output stream with the specified buffer
    65      * size.
    66      *
    67      * @param   out    the underlying output stream.
    68      * @param   size   the buffer size.
    69      * @exception IllegalArgumentException if size &lt;= 0.
    70      */
    71     public BufferedOutputStream(OutputStream out, int size) {
    72         super(out);
    73         if (size <= 0) {
    74             throw new IllegalArgumentException("Buffer size <= 0");
    75         }
    76         buf = new byte[size];
    77     }
    78 
    79     /** Flush the internal buffer */
    80     private void flushBuffer() throws IOException {
    81         if (count > 0) {
    82             out.write(buf, 0, count);
    83             count = 0;
    84         }
    85     }
    86 
    87     /**
    88      * Writes the specified byte to this buffered output stream.
    89      *
    90      * @param      b   the byte to be written.
    91      * @exception  IOException  if an I/O error occurs.
    92      */
    93     public synchronized void write(int b) throws IOException {
    94         if (count >= buf.length) {
    95             flushBuffer();
    96         }
    97         buf[count++] = (byte)b;
    98     }
    99 
   100     /**
   101      * Writes <code>len</code> bytes from the specified byte array
   102      * starting at offset <code>off</code> to this buffered output stream.
   103      *
   104      * <p> Ordinarily this method stores bytes from the given array into this
   105      * stream's buffer, flushing the buffer to the underlying output stream as
   106      * needed.  If the requested length is at least as large as this stream's
   107      * buffer, however, then this method will flush the buffer and write the
   108      * bytes directly to the underlying output stream.  Thus redundant
   109      * <code>BufferedOutputStream</code>s will not copy data unnecessarily.
   110      *
   111      * @param      b     the data.
   112      * @param      off   the start offset in the data.
   113      * @param      len   the number of bytes to write.
   114      * @exception  IOException  if an I/O error occurs.
   115      */
   116     public synchronized void write(byte b[], int off, int len) throws IOException {
   117         if (len >= buf.length) {
   118             /* If the request length exceeds the size of the output buffer,
   119                flush the output buffer and then write the data directly.
   120                In this way buffered streams will cascade harmlessly. */
   121             flushBuffer();
   122             out.write(b, off, len);
   123             return;
   124         }
   125         if (len > buf.length - count) {
   126             flushBuffer();
   127         }
   128         System.arraycopy(b, off, buf, count, len);
   129         count += len;
   130     }
   131 
   132     /**
   133      * Flushes this buffered output stream. This forces any buffered
   134      * output bytes to be written out to the underlying output stream.
   135      *
   136      * @exception  IOException  if an I/O error occurs.
   137      * @see        java.io.FilterOutputStream#out
   138      */
   139     public synchronized void flush() throws IOException {
   140         flushBuffer();
   141         out.flush();
   142     }
   143 }