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