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