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