// BufferedWriter.java - Filtered character output stream. /* Copyright (C) 1998, 1999 Cygnus Solutions This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package java.io; /** * @author Tom Tromey * @date September 25, 1998 */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ // Why not extend FilterWriter? public class BufferedWriter extends Writer { public BufferedWriter (Writer out) { this (out, 8192); } public BufferedWriter (Writer ox, int size) { super (ox); out = ox; buffer = new char[size]; count = 0; } public void close () throws IOException { localFlush (); out.close(); } public void flush () throws IOException { localFlush (); out.flush(); } public void newLine () throws IOException { write (System.getProperty("line.separator")); } public void write (int oneChar) throws IOException { synchronized (lock) { buffer[count++] = (char) oneChar; if (count == buffer.length) localFlush (); } } public void write (char[] buf, int offset, int len) throws IOException { if (offset < 0 || len < 0 || offset + len > buf.length) throw new ArrayIndexOutOfBoundsException (); synchronized (lock) { // Bypass buffering if there is too much incoming data. if (count + len > buffer.length) { localFlush (); out.write(buf, offset, len); } else { System.arraycopy(buf, offset, buffer, count, len); count += len; if (count == buffer.length) localFlush (); } } } public void write (String str, int offset, int len) throws IOException { if (offset < 0 || len < 0 || offset + len < str.length()) throw new ArrayIndexOutOfBoundsException (); synchronized (lock) { if (count + len > buffer.length) { localFlush (); out.write(str, offset, len); } else { str.getChars(offset, offset + len, buffer, count); count += len; if (count == buffer.length) localFlush (); } } } private final void localFlush () throws IOException { if (count > 0) { synchronized (lock) { out.write(buffer, 0, count); count = 0; } } } // The downstream writer. private Writer out; // The character buffer. char[] buffer; // Number of valid chars in buffer. int count; }