151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 261cf642f86a0af82e88fb27f31e6842435326b5aPrzemyslaw Szczepaniak * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.io; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Abstract class for writing to character streams. The only methods that a 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * subclass must implement are write(char[], int, int), flush(), and close(). 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Most subclasses, however, will override some of the methods defined here in 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * order to provide higher efficiency, additional functionality, or both. 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Writer 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see BufferedWriter 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CharArrayWriter 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see FilterWriter 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see OutputStreamWriter 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see FileWriter 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see PipedWriter 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see PrintWriter 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see StringWriter 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Reader 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Mark Reinhold 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.1 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class Writer implements Appendable, Closeable, Flushable { 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Temporary buffer used to hold writes of strings and single characters 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private char[] writeBuffer; 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Size of writeBuffer, must be >= 1 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6061cf642f86a0af82e88fb27f31e6842435326b5aPrzemyslaw Szczepaniak private static final int WRITE_BUFFER_SIZE = 1024; 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The object used to synchronize operations on this stream. For 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * efficiency, a character-stream object may use an object other than 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * itself to protect critical sections. A subclass should therefore use 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the object in this field rather than <tt>this</tt> or a synchronized 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method. 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Object lock; 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new character-stream writer whose critical sections will 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * synchronize on the writer itself. 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Writer() { 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.lock = this; 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new character-stream writer whose critical sections will 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * synchronize on the given object. 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param lock 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Object to synchronize on 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Writer(Object lock) { 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lock == null) { 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.lock = lock; 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a single character. The character to be written is contained in 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the 16 low-order bits of the given integer value; the 16 high-order bits 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are ignored. 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Subclasses that intend to support efficient single-character output 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * should override this method. 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param c 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * int specifying a character to be written 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void write(int c) throws IOException { 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lock) { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (writeBuffer == null){ 11061cf642f86a0af82e88fb27f31e6842435326b5aPrzemyslaw Szczepaniak writeBuffer = new char[WRITE_BUFFER_SIZE]; 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski writeBuffer[0] = (char) c; 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(writeBuffer, 0, 1); 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes an array of characters. 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param cbuf 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Array of characters to be written 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void write(char cbuf[]) throws IOException { 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(cbuf, 0, cbuf.length); 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a portion of an array of characters. 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param cbuf 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Array of characters 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param off 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Offset from which to start writing characters 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param len 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Number of characters to write 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski abstract public void write(char cbuf[], int off, int len) throws IOException; 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a string. 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param str 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * String to be written 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void write(String str) throws IOException { 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(str, 0, str.length()); 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a portion of a string. 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param str 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A String 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param off 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Offset from which to start writing characters 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param len 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Number of characters to write 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IndexOutOfBoundsException 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If <tt>off</tt> is negative, or <tt>len</tt> is negative, 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or <tt>off+len</tt> is negative or greater than the length 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the given string 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void write(String str, int off, int len) throws IOException { 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lock) { 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski char cbuf[]; 18361cf642f86a0af82e88fb27f31e6842435326b5aPrzemyslaw Szczepaniak if (len <= WRITE_BUFFER_SIZE) { 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (writeBuffer == null) { 18561cf642f86a0af82e88fb27f31e6842435326b5aPrzemyslaw Szczepaniak writeBuffer = new char[WRITE_BUFFER_SIZE]; 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cbuf = writeBuffer; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { // Don't permanently allocate very large buffers. 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cbuf = new char[len]; 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski str.getChars(off, (off + len), cbuf, 0); 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(cbuf, 0, len); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Appends the specified character sequence to this writer. 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> An invocation of this method of the form <tt>out.append(csq)</tt> 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * behaves in exactly the same way as the invocation 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * out.write(csq.toString()) </pre> 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Depending on the specification of <tt>toString</tt> for the 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * character sequence <tt>csq</tt>, the entire sequence may not be 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * appended. For instance, invoking the <tt>toString</tt> method of a 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * character buffer will return a subsequence whose content depends upon 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the buffer's position and limit. 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param csq 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The character sequence to append. If <tt>csq</tt> is 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>null</tt>, then the four characters <tt>"null"</tt> are 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * appended to this writer. 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return This writer 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Writer append(CharSequence csq) throws IOException { 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (csq == null) 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write("null"); 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(csq.toString()); 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this; 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Appends a subsequence of the specified character sequence to this writer. 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Appendable</tt>. 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> An invocation of this method of the form <tt>out.append(csq, start, 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * end)</tt> when <tt>csq</tt> is not <tt>null</tt> behaves in exactly the 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * same way as the invocation 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * out.write(csq.subSequence(start, end).toString()) </pre> 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param csq 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The character sequence from which a subsequence will be 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * appended. If <tt>csq</tt> is <tt>null</tt>, then characters 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will be appended as if <tt>csq</tt> contained the four 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * characters <tt>"null"</tt>. 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param start 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The index of the first character in the subsequence 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param end 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The index of the character following the last character in the 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * subsequence 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return This writer 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IndexOutOfBoundsException 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt> 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is greater than <tt>end</tt>, or <tt>end</tt> is greater than 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>csq.length()</tt> 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Writer append(CharSequence csq, int start, int end) throws IOException { 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CharSequence cs = (csq == null ? "null" : csq); 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(cs.subSequence(start, end).toString()); 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this; 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Appends the specified character to this writer. 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> An invocation of this method of the form <tt>out.append(c)</tt> 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * behaves in exactly the same way as the invocation 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * out.write(c) </pre> 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param c 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The 16-bit character to append 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return This writer 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Writer append(char c) throws IOException { 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(c); 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this; 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Flushes the stream. If the stream has saved any characters from the 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * various write() methods in a buffer, write them immediately to their 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * intended destination. Then, if that destination is another character or 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * byte stream, flush it. Thus one flush() invocation will flush all the 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * buffers in a chain of Writers and OutputStreams. 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If the intended destination of this stream is an abstraction provided 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by the underlying operating system, for example a file, then flushing the 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream guarantees only that bytes previously written to the stream are 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * passed to the operating system for writing; it does not guarantee that 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * they are actually written to a physical device such as a disk drive. 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski abstract public void flush() throws IOException; 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Closes the stream, flushing it first. Once the stream has been closed, 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * further write() or flush() invocations will cause an IOException to be 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * thrown. Closing a previously closed stream has no effect. 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski abstract public void close() throws IOException; 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 326