1db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornpackage com.android.internal.util;
2db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
36d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornimport android.util.Printer;
46d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn
5db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.IOException;
6db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.OutputStream;
7db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.PrintWriter;
8db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.UnsupportedEncodingException;
9db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.Writer;
10db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.ByteBuffer;
11db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.CharBuffer;
12db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.Charset;
13db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.CharsetEncoder;
14db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.CoderResult;
15db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.CodingErrorAction;
16db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
17db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornpublic class FastPrintWriter extends PrintWriter {
18b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    private static class DummyWriter extends Writer {
19e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        @Override
20e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        public void close() throws IOException {
21e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            UnsupportedOperationException ex
22e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    = new UnsupportedOperationException("Shouldn't be here");
23e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            throw ex;
24e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
25e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
26e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        @Override
27e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        public void flush() throws IOException {
28e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            close();
29e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
30e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
31e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        @Override
32e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        public void write(char[] buf, int offset, int count) throws IOException {
33e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            close();
34e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
35e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    };
36e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
378c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    private final int mBufferLen;
388c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    private final char[] mText;
39db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    private int mPos;
40db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
41db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    final private OutputStream mOutputStream;
42e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    final private boolean mAutoFlush;
43e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    final private String mSeparator;
448c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
458c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    final private Writer mWriter;
466d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    final private Printer mPrinter;
478c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
48db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    private CharsetEncoder mCharset;
498c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    final private ByteBuffer mBytes;
508c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
51e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private boolean mIoError;
52db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
53db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
54db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code out} as its target
55db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * stream. By default, the new print writer does not automatically flush its
56db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * contents to the target stream when a newline is encountered.
57db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
58db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param out
59db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target output stream.
60db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
61db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code out} is {@code null}.
62db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
63db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(OutputStream out) {
648c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(out, false, 8192);
65db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
66db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
67db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
68db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code out} as its target
69db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * stream. The parameter {@code autoFlush} determines if the print writer
70db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * automatically flushes its contents to the target stream when a newline is
71db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * encountered.
72db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
73db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param out
74db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target output stream.
75db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param autoFlush
76db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            indicates whether contents are flushed upon encountering a
77db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            newline sequence.
78db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
79db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code out} is {@code null}.
80db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
81db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(OutputStream out, boolean autoFlush) {
828c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(out, autoFlush, 8192);
838c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    }
848c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
858c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    /**
868c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * Constructs a new {@code PrintWriter} with {@code out} as its target
878c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * stream and a custom buffer size. The parameter {@code autoFlush} determines
888c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * if the print writer automatically flushes its contents to the target stream
898c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * when a newline is encountered.
908c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *
918c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param out
928c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            the target output stream.
938c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param autoFlush
948c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            indicates whether contents are flushed upon encountering a
958c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            newline sequence.
968c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param bufferLen
978c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            specifies the size of the FastPrintWriter's internal buffer; the
988c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            default is 8192.
998c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @throws NullPointerException
1008c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *             if {@code out} is {@code null}.
1018c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     */
1028c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    public FastPrintWriter(OutputStream out, boolean autoFlush, int bufferLen) {
103b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        super(new DummyWriter(), autoFlush);
1048c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        if (out == null) {
1058c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            throw new NullPointerException("out is null");
1068c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        }
1078c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBufferLen = bufferLen;
1088c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mText = new char[bufferLen];
1098c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBytes = ByteBuffer.allocate(mBufferLen);
110db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mOutputStream = out;
111e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mWriter = null;
1126d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mPrinter = null;
113e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mAutoFlush = autoFlush;
114e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mSeparator = System.lineSeparator();
115db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        initDefaultEncoder();
116db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
117db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
118db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
119db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code wr} as its target
120db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * writer. By default, the new print writer does not automatically flush its
121db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * contents to the target writer when a newline is encountered.
122db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
1238c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * <p>NOTE: Unlike PrintWriter, this version will still do buffering inside of
1248c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * FastPrintWriter before sending data to the Writer.  This means you must call
1258c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * flush() before retrieving any data from the Writer.</p>
1268c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *
127db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param wr
128db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target writer.
129db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
130db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code wr} is {@code null}.
131db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
132db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(Writer wr) {
1338c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(wr, false, 8192);
134db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
135db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
136db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
1376d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code wr} as its target
138db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * writer. The parameter {@code autoFlush} determines if the print writer
139db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * automatically flushes its contents to the target writer when a newline is
140db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * encountered.
141db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
142db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param wr
143db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target writer.
144db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param autoFlush
145db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            indicates whether to flush contents upon encountering a
146db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            newline sequence.
147db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
148db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code out} is {@code null}.
149db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
150db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(Writer wr, boolean autoFlush) {
1518c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(wr, autoFlush, 8192);
1528c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    }
1538c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
1548c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    /**
1556d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code wr} as its target
1568c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * writer and a custom buffer size. The parameter {@code autoFlush} determines
1578c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * if the print writer automatically flushes its contents to the target writer
1588c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * when a newline is encountered.
1598c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *
1608c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param wr
1618c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            the target writer.
1628c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param autoFlush
1638c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            indicates whether to flush contents upon encountering a
1648c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            newline sequence.
1658c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param bufferLen
1668c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            specifies the size of the FastPrintWriter's internal buffer; the
1678c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            default is 8192.
1688c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @throws NullPointerException
1698c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *             if {@code wr} is {@code null}.
1708c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     */
1718c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    public FastPrintWriter(Writer wr, boolean autoFlush, int bufferLen) {
172b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        super(new DummyWriter(), autoFlush);
1738c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        if (wr == null) {
1748c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            throw new NullPointerException("wr is null");
1758c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        }
1768c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBufferLen = bufferLen;
1778c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mText = new char[bufferLen];
1788c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBytes = null;
179db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mOutputStream = null;
180e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mWriter = wr;
1816d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mPrinter = null;
182e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mAutoFlush = autoFlush;
183e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mSeparator = System.lineSeparator();
184db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        initDefaultEncoder();
185db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
186db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
1876d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    /**
1886d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code pr} as its target
1896d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * printer and the default buffer size.  Because a {@link Printer} is line-base,
1906d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * autoflush is always enabled.
1916d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *
1926d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @param pr
1936d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            the target writer.
1946d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @throws NullPointerException
1956d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *             if {@code pr} is {@code null}.
1966d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     */
1976d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    public FastPrintWriter(Printer pr) {
1986d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        this(pr, 512);
1996d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    }
2006d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn
2016d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    /**
2026d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code pr} as its target
2036d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * printer and a custom buffer size.  Because a {@link Printer} is line-base,
2046d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * autoflush is always enabled.
2056d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *
2066d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @param pr
2076d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            the target writer.
2086d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @param bufferLen
2096d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            specifies the size of the FastPrintWriter's internal buffer; the
2106d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            default is 512.
2116d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @throws NullPointerException
2126d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *             if {@code pr} is {@code null}.
2136d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     */
2146d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    public FastPrintWriter(Printer pr, int bufferLen) {
215b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        super(new DummyWriter(), true);
2166d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        if (pr == null) {
2176d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            throw new NullPointerException("pr is null");
2186d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        }
2196d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mBufferLen = bufferLen;
2206d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mText = new char[bufferLen];
2216d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mBytes = null;
2226d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mOutputStream = null;
2236d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mWriter = null;
2246d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mPrinter = pr;
2256d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mAutoFlush = true;
2266d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mSeparator = System.lineSeparator();
2276d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        initDefaultEncoder();
2286d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    }
2296d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn
230e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private final void initEncoder(String csn) throws UnsupportedEncodingException {
231e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        try {
232e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            mCharset = Charset.forName(csn).newEncoder();
233e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } catch (Exception e) {
234e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            throw new UnsupportedEncodingException(csn);
235e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
236e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mCharset.onMalformedInput(CodingErrorAction.REPLACE);
237e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mCharset.onUnmappableCharacter(CodingErrorAction.REPLACE);
238db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
239db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
240db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
241e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Flushes this writer and returns the value of the error flag.
242db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
243e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * @return {@code true} if either an {@code IOException} has been thrown
244e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     *         previously or if {@code setError()} has been called;
245e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     *         {@code false} otherwise.
246e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * @see #setError()
247db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
248e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public boolean checkError() {
249e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        flush();
250e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
251e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            return mIoError;
252e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
253db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
254db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
255db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
256e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Sets the error state of the stream to false.
257e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * @since 1.6
258db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
259e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    protected void clearError() {
260e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
261e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            mIoError = false;
262e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
263db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
264db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
265e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    /**
266e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Sets the error flag of this writer to true.
267db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
268e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    protected void setError() {
269e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
270e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            mIoError = true;
271db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
272db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
273db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
274db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    private final void initDefaultEncoder() {
275db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mCharset = Charset.defaultCharset().newEncoder();
276db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mCharset.onMalformedInput(CodingErrorAction.REPLACE);
277db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mCharset.onUnmappableCharacter(CodingErrorAction.REPLACE);
278db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
279db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
280e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void appendLocked(char c) throws IOException {
281db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int pos = mPos;
2828c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        if (pos >= (mBufferLen-1)) {
283e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            flushLocked();
284db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            pos = mPos;
285db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
286db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mText[pos] = c;
287db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mPos = pos+1;
288db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
289db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
290e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void appendLocked(String str, int i, final int length) throws IOException {
2918c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        final int BUFFER_LEN = mBufferLen;
292db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (length > BUFFER_LEN) {
293db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            final int end = i + length;
294db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            while (i < end) {
295db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                int next = i + BUFFER_LEN;
296e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, i, next < end ? BUFFER_LEN : (end - i));
297db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                i = next;
298db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            }
299db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            return;
300db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
301db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int pos = mPos;
302db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if ((pos+length) > BUFFER_LEN) {
303e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            flushLocked();
304db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            pos = mPos;
305db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
306db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        str.getChars(i, i + length, mText, pos);
307db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mPos = pos + length;
308db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
309db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
310e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void appendLocked(char[] buf, int i, final int length) throws IOException {
3118c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        final int BUFFER_LEN = mBufferLen;
312db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (length > BUFFER_LEN) {
313db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            final int end = i + length;
314db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            while (i < end) {
315db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                int next = i + BUFFER_LEN;
316e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(buf, i, next < end ? BUFFER_LEN : (end - i));
317db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                i = next;
318db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            }
319db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            return;
320db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
321db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int pos = mPos;
322db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if ((pos+length) > BUFFER_LEN) {
323e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            flushLocked();
324db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            pos = mPos;
325db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
326db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        System.arraycopy(buf, i, mText, pos, length);
327db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mPos = pos + length;
328db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
329db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
330e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void flushBytesLocked() throws IOException {
331db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int position;
332db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if ((position = mBytes.position()) > 0) {
333db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            mBytes.flip();
334db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            mOutputStream.write(mBytes.array(), 0, position);
335db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            mBytes.clear();
336db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
337db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
338db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
339e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void flushLocked() throws IOException {
340db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        //Log.i("PackageManager", "flush mPos=" + mPos);
341db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (mPos > 0) {
342db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            if (mOutputStream != null) {
343db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos);
344db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                CoderResult result = mCharset.encode(charBuffer, mBytes, true);
345db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                while (true) {
346db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    if (result.isError()) {
347db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                        throw new IOException(result.toString());
348db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    } else if (result.isOverflow()) {
349e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                        flushBytesLocked();
350db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                        result = mCharset.encode(charBuffer, mBytes, true);
351db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                        continue;
352db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    }
353db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    break;
354db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                }
355e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                flushBytesLocked();
356db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                mOutputStream.flush();
3576d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            } else if (mWriter != null) {
358e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                mWriter.write(mText, 0, mPos);
359e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                mWriter.flush();
3606d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            } else {
3616d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                int nonEolOff = 0;
3626d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                final int sepLen = mSeparator.length();
3636d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                final int len = sepLen < mPos ? sepLen : mPos;
3646d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                while (nonEolOff < len && mText[mPos-1-nonEolOff]
3656d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                        == mSeparator.charAt(mSeparator.length()-1-nonEolOff)) {
3666d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                    nonEolOff++;
3676d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                }
3686d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                if (nonEolOff >= mPos) {
3696d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                    mPrinter.println("");
3706d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                } else {
3716d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                    mPrinter.println(new String(mText, 0, mPos-nonEolOff));
3726d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                }
373db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            }
374db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            mPos = 0;
375db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
376db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
377db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
378db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
379db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Ensures that all pending data is sent out to the target. It also
380db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * flushes the target. If an I/O error occurs, this writer's error
381db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * state is set to {@code true}.
382db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
383db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
384db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void flush() {
385e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
386e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
387e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                flushLocked();
388e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                if (mOutputStream != null) {
389e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    mOutputStream.flush();
3906d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                } else if (mWriter != null) {
391e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    mWriter.flush();
392e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                }
393e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
394e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
395e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
396e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
397e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
398e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
399e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
400e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void close() {
401e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
402e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
403e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                flushLocked();
404e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                if (mOutputStream != null) {
405e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    mOutputStream.close();
4066d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                } else if (mWriter != null) {
407e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    mWriter.close();
408e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                }
409e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
410e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
411e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
412db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
413db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
414db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
415db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
416db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the specified character array
417db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * to the target.
418db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
419db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param charArray
420db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character array to print to the target.
421db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @see #print(String)
422db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
423db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void print(char[] charArray) {
424e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
425e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
426e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(charArray, 0, charArray.length);
427e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
428e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
429db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
430db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
431db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
432db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
433db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the specified character to the
434db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * target.
435db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
436db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param ch
437db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character to print to the target.
438db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @see #print(String)
439db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
440db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void print(char ch) {
441e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
442e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
443e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(ch);
444e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
445e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
446db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
447db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
448db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
449db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
450db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints a string to the target. The string is converted to an array of
451db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * bytes using the encoding chosen during the construction of this writer.
452db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * The bytes are then written to the target with {@code write(int)}.
453db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * <p>
454db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * If an I/O error occurs, this writer's error flag is set to {@code true}.
455db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
456db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param str
457db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the string to print to the target.
458db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @see #write(int)
459db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
460db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void print(String str) {
461db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (str == null) {
462db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            str = String.valueOf((Object) null);
463db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
464e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
465e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
466e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, 0, str.length());
467e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
468e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
469e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
470e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
471e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
472e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
473e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
474e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
475e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void print(int inum) {
476e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (inum == 0) {
477e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            print("0");
478e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
479e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            super.print(inum);
480e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
481e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
482e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
483e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
484e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void print(long lnum) {
485e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (lnum == 0) {
486e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            print("0");
487e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
488e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            super.print(lnum);
489e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
490e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
491e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
492e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    /**
493e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Prints a newline. Flushes this writer if the autoFlush flag is set to {@code true}.
494e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     */
495e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void println() {
496e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
497e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
498e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(mSeparator, 0, mSeparator.length());
499e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                if (mAutoFlush) {
500e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    flushLocked();
501e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                }
502e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
503e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
504e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
505e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
506e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
507e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
508e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
509e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void println(int inum) {
510e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (inum == 0) {
511e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            println("0");
512e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
513e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            super.println(inum);
514e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
515e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
516e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
517e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
518e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void println(long lnum) {
519e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (lnum == 0) {
520e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            println("0");
521e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
52220cdcee47d10986969e7e2a53a40a6ecabae3827Dianne Hackborn            super.println(lnum);
523db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
524db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
525db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
526db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
527db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the character array {@code chars} followed by a newline.
528db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Flushes this writer if the autoFlush flag is set to {@code true}.
529db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
530db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void println(char[] chars) {
531db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        print(chars);
532db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        println();
533db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
534db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
535db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
536db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the char {@code c} followed by a newline.
537db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Flushes this writer if the autoFlush flag is set to {@code true}.
538db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
539db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void println(char c) {
540db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        print(c);
541db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        println();
542db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
543db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
544db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
545db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes {@code count} characters from {@code buffer} starting at {@code
546db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * offset} to the target.
547db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * <p>
548db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * This writer's error flag is set to {@code true} if this writer is closed
549db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * or an I/O error occurs.
550db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
551db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param buf
552db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the buffer to write to the target.
553db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param offset
554db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the first character in {@code buffer} to write.
555db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param count
556db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the number of characters in {@code buffer} to write.
557db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws IndexOutOfBoundsException
558db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code offset < 0} or {@code count < 0}, or if {@code
559db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             offset + count} is greater than the length of {@code buf}.
560db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
561db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
562db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(char[] buf, int offset, int count) {
563e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
564e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
565e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(buf, offset, count);
566e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
567e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
568db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
569db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
570db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
571db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
572db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes one character to the target. Only the two least significant bytes
573db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * of the integer {@code oneChar} are written.
574db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * <p>
575db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * This writer's error flag is set to {@code true} if this writer is closed
576db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * or an I/O error occurs.
577db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
578db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param oneChar
579db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character to write to the target.
580db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
581db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
582db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(int oneChar) {
583e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
584e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
585e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked((char) oneChar);
586e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
587e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
588db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
589db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
590db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
591db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
592db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes the characters from the specified string to the target.
593db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
594db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param str
595db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the non-null string containing the characters to write.
596db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
597db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
598db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(String str) {
599e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
600e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
601e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, 0, str.length());
602e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
603e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
604db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
605db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
606db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
607db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
608db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes {@code count} characters from {@code str} starting at {@code
609db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * offset} to the target.
610db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
611db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param str
612db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the non-null string containing the characters to write.
613db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param offset
614db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the first character in {@code str} to write.
615db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param count
616db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the number of characters from {@code str} to write.
617db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws IndexOutOfBoundsException
618db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code offset < 0} or {@code count < 0}, or if {@code
619db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             offset + count} is greater than the length of {@code str}.
620db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
621db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
622db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(String str, int offset, int count) {
623e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
624e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
625e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, offset, count);
626e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
627e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
628db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
629db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
630db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
631db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
632db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Appends a subsequence of the character sequence {@code csq} to the
633db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * target. This method works the same way as {@code
634db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * PrintWriter.print(csq.subsequence(start, end).toString())}. If {@code
635db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * csq} is {@code null}, then the specified subsequence of the string "null"
636db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * will be written to the target.
637db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
638db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param csq
639db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character sequence appended to the target.
640db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param start
641db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the first char in the character sequence appended
642db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            to the target.
643db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param end
644db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the character following the last character of the
645db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            subsequence appended to the target.
646db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @return this writer.
647db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws StringIndexOutOfBoundsException
648db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code start > end}, {@code start < 0}, {@code end < 0} or
649db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             either {@code start} or {@code end} are greater or equal than
650db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             the length of {@code csq}.
651db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
652db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
653db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public PrintWriter append(CharSequence csq, int start, int end) {
654db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (csq == null) {
655db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            csq = "null";
656db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
657db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        String output = csq.subSequence(start, end).toString();
658db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        write(output, 0, output.length());
659db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        return this;
660db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
661db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn}
662