PrintStream.java revision 3377
694N/A * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. Oracle designates this 0N/A * particular file as subject to the "Classpath" exception as provided 0N/A * by Oracle in the LICENSE file that accompanied this code. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 553N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 553N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 0N/A * or visit www.oracle.com if you need additional information or have any 0N/A * A <code>PrintStream</code> adds functionality to another output stream, 0N/A * namely the ability to print representations of various data values 0N/A * conveniently. Two other features are provided as well. Unlike other output 0N/A * streams, a <code>PrintStream</code> never throws an 0N/A * <code>IOException</code>; instead, exceptional situations merely set an 0N/A * internal flag that can be tested via the <code>checkError</code> method. 0N/A * Optionally, a <code>PrintStream</code> can be created so as to flush 0N/A * automatically; this means that the <code>flush</code> method is * automatically invoked after a byte array is written, one of the * <code>println</code> methods is invoked, or a newline character or byte * (<code>'\n'</code>) is written. * <p> All characters printed by a <code>PrintStream</code> are converted into * bytes using the platform's default character encoding. The <code>{@link * PrintWriter}</code> class should be used in situations that require writing * characters rather than bytes. * Track both the text- and character-output streams, so that their buffers * can be flushed without flushing the entire stream. * nonNull is explicitly delcared here so as not to create an extra * dependency on java.util.Objects.nonNull. PrintStream is loaded * early during system initialization. * Returns a charset object for the given charset name. * @throws NullPointerException is csn is null * @throws UnsupportedEncodingException if the charset is not supported // UnsupportedEncodingException should be thrown /* Private constructors */ /* Variant of the private constructor so that the given charset name * can be verified before evaluating the OutputStream argument. Used * by constructors creating a FileOutputStream that also take a * Creates a new print stream. This stream will not flush automatically. * @param out The output stream to which values and objects will be * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream) * Creates a new print stream. * @param out The output stream to which values and objects will be * @param autoFlush A boolean; if true, the output buffer will be flushed * whenever a byte array is written, one of the * <code>println</code> methods is invoked, or a newline * character or byte (<code>'\n'</code>) is written * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean) * Creates a new print stream. * @param out The output stream to which values and objects will be * @param autoFlush A boolean; if true, the output buffer will be flushed * whenever a byte array is written, one of the * <code>println</code> methods is invoked, or a newline * character or byte (<code>'\n'</code>) is written * @param encoding The name of a supported * @throws UnsupportedEncodingException * If the named encoding is not supported * Creates a new print stream, without automatic line flushing, with the * specified file name. This convenience constructor creates * the necessary intermediate {@link java.io.OutputStreamWriter * OutputStreamWriter}, which will encode characters using the * {@linkplain java.nio.charset.Charset#defaultCharset() default charset} * for this instance of the Java virtual machine. * The name of the file to use as the destination of this print * stream. If the file exists, then it will be truncated to * zero size; otherwise, a new file will be created. The output * will be written to the file and is buffered. * @throws FileNotFoundException * If the given file object does not denote an existing, writable * regular file and a new regular file of that name cannot be * created, or if some other error occurs while opening or * @throws SecurityException * If a security manager is present and {@link * SecurityManager#checkWrite checkWrite(fileName)} denies write * Creates a new print stream, without automatic line flushing, with the * specified file name and charset. This convenience constructor creates * the necessary intermediate {@link java.io.OutputStreamWriter * OutputStreamWriter}, which will encode characters using the provided * The name of the file to use as the destination of this print * stream. If the file exists, then it will be truncated to * zero size; otherwise, a new file will be created. The output * will be written to the file and is buffered. * The name of a supported {@linkplain java.nio.charset.Charset * @throws FileNotFoundException * If the given file object does not denote an existing, writable * regular file and a new regular file of that name cannot be * created, or if some other error occurs while opening or * @throws SecurityException * If a security manager is present and {@link * SecurityManager#checkWrite checkWrite(fileName)} denies write * @throws UnsupportedEncodingException * If the named charset is not supported // ensure charset is checked before the file is opened * Creates a new print stream, without automatic line flushing, with the * specified file. This convenience constructor creates the necessary * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter}, * which will encode characters using the {@linkplain * java.nio.charset.Charset#defaultCharset() default charset} for this * instance of the Java virtual machine. * The file to use as the destination of this print stream. If the * file exists, then it will be truncated to zero size; otherwise, * a new file will be created. The output will be written to the * @throws FileNotFoundException * If the given file object does not denote an existing, writable * regular file and a new regular file of that name cannot be * created, or if some other error occurs while opening or * @throws SecurityException * If a security manager is present and {@link * SecurityManager#checkWrite checkWrite(file.getPath())} * denies write access to the file * Creates a new print stream, without automatic line flushing, with the * specified file and charset. This convenience constructor creates * the necessary intermediate {@link java.io.OutputStreamWriter * OutputStreamWriter}, which will encode characters using the provided * The file to use as the destination of this print stream. If the * file exists, then it will be truncated to zero size; otherwise, * a new file will be created. The output will be written to the * The name of a supported {@linkplain java.nio.charset.Charset * @throws FileNotFoundException * If the given file object does not denote an existing, writable * regular file and a new regular file of that name cannot be * created, or if some other error occurs while opening or * @throws SecurityException * If a security manager is presentand {@link * SecurityManager#checkWrite checkWrite(file.getPath())} * denies write access to the file * @throws UnsupportedEncodingException * If the named charset is not supported // ensure charset is checked before the file is opened /** Check to make sure that the stream has not been closed */ * Flushes the stream. This is done by writing any buffered output bytes to * the underlying output stream and then flushing that stream. * @see java.io.OutputStream#flush() private boolean closing =
false;
/* To avoid recursive closing */ * Closes the stream. This is done by flushing the stream and then closing * the underlying output stream. * @see java.io.OutputStream#close() * Flushes the stream and checks its error state. The internal error state * is set to <code>true</code> when the underlying output stream throws an * <code>IOException</code> other than <code>InterruptedIOException</code>, * and when the <code>setError</code> method is invoked. If an operation * on the underlying output stream throws an * <code>InterruptedIOException</code>, then the <code>PrintStream</code> * converts the exception back into an interrupt by doing: * Thread.currentThread().interrupt(); * @return <code>true</code> if and only if this stream has encountered an * <code>IOException</code> other than * <code>InterruptedIOException</code>, or the * <code>setError</code> method has been invoked * Sets the error state of the stream to <code>true</code>. * <p> This method will cause subsequent invocations of {@link * #checkError()} to return <tt>true</tt> until {@link * #clearError()} is invoked. * Clears the internal error state of this stream. * <p> This method will cause subsequent invocations of {@link * #checkError()} to return <tt>false</tt> until another write * operation fails and invokes {@link #setError()}. * Exception-catching, synchronized output operations, * which also implement the write() methods of OutputStream * Writes the specified byte to this stream. If the byte is a newline and * automatic flushing is enabled then the <code>flush</code> method will be * <p> Note that the byte is written as given; to write a character that * will be translated according to the platform's default character * encoding, use the <code>print(char)</code> or <code>println(char)</code> * @param b The byte to be written public void write(
int b) {
* Writes <code>len</code> bytes from the specified byte array starting at * offset <code>off</code> to this stream. If automatic flushing is * enabled then the <code>flush</code> method will be invoked. * <p> Note that the bytes will be written as given; to write characters * that will be translated according to the platform's default character * encoding, use the <code>print(char)</code> or <code>println(char)</code> * @param buf A byte array * @param off Offset from which to start taking bytes * @param len Number of bytes to write * The following private methods on the text- and character-output streams * always flush the stream buffers, so that writes to the underlying byte * stream occur as promptly as with the original PrintStream. /* Methods that do not terminate lines */ * Prints a boolean value. The string produced by <code>{@link * java.lang.String#valueOf(boolean)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param b The <code>boolean</code> to be printed public void print(
boolean b) {
write(b ?
"true" :
"false");
* Prints a character. The character is translated into one or more bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param c The <code>char</code> to be printed public void print(
char c) {
* Prints an integer. The string produced by <code>{@link * java.lang.String#valueOf(int)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param i The <code>int</code> to be printed * @see java.lang.Integer#toString(int) public void print(
int i) {
* Prints a long integer. The string produced by <code>{@link * java.lang.String#valueOf(long)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param l The <code>long</code> to be printed * @see java.lang.Long#toString(long) public void print(
long l) {
* Prints a floating-point number. The string produced by <code>{@link * java.lang.String#valueOf(float)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param f The <code>float</code> to be printed * @see java.lang.Float#toString(float) public void print(
float f) {
* Prints a double-precision floating-point number. The string produced by * <code>{@link java.lang.String#valueOf(double)}</code> is translated into * bytes according to the platform's default character encoding, and these * bytes are written in exactly the manner of the <code>{@link * #write(int)}</code> method. * @param d The <code>double</code> to be printed * @see java.lang.Double#toString(double) public void print(
double d) {
* Prints an array of characters. The characters are converted into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param s The array of chars to be printed * @throws NullPointerException If <code>s</code> is <code>null</code> public void print(
char s[]) {
* Prints a string. If the argument is <code>null</code> then the string * <code>"null"</code> is printed. Otherwise, the string's characters are * converted into bytes according to the platform's default character * encoding, and these bytes are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param s The <code>String</code> to be printed * Prints an object. The string produced by the <code>{@link * java.lang.String#valueOf(Object)}</code> method is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the * <code>{@link #write(int)}</code> method. * @param obj The <code>Object</code> to be printed * @see java.lang.Object#toString() /* Methods that do terminate lines */ * Terminates the current line by writing the line separator string. The * line separator string is defined by the system property * <code>line.separator</code>, and is not necessarily a single newline * character (<code>'\n'</code>). * Prints a boolean and then terminate the line. This method behaves as * though it invokes <code>{@link #print(boolean)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>boolean</code> to be printed * Prints a character and then terminate the line. This method behaves as * though it invokes <code>{@link #print(char)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>char</code> to be printed. * Prints an integer and then terminate the line. This method behaves as * though it invokes <code>{@link #print(int)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>int</code> to be printed. * Prints a long and then terminate the line. This method behaves as * though it invokes <code>{@link #print(long)}</code> and then * <code>{@link #println()}</code>. * @param x a The <code>long</code> to be printed. * Prints a float and then terminate the line. This method behaves as * though it invokes <code>{@link #print(float)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>float</code> to be printed. * Prints a double and then terminate the line. This method behaves as * though it invokes <code>{@link #print(double)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>double</code> to be printed. * Prints an array of characters and then terminate the line. This method * behaves as though it invokes <code>{@link #print(char[])}</code> and * then <code>{@link #println()}</code>. * @param x an array of chars to print. * Prints a String and then terminate the line. This method behaves as * though it invokes <code>{@link #print(String)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>String</code> to be printed. * Prints an Object and then terminate the line. This method calls * at first String.valueOf(x) to get the printed object's string value, * though it invokes <code>{@link #print(String)}</code> and then * <code>{@link #println()}</code>. * @param x The <code>Object</code> to be printed. * A convenience method to write a formatted string to this output stream * using the specified format string and arguments. * <p> An invocation of this method of the form <tt>out.printf(format, * args)</tt> behaves in exactly the same way as the invocation * out.format(format, args) </pre> * A format string as described in <a * Arguments referenced by the format specifiers in the format * string. If there are more arguments than format specifiers, the * extra arguments are ignored. The number of arguments is * variable and may be zero. The maximum number of arguments is * limited by the maximum dimension of a Java array as defined by * Virtual Machine Specification</a>. The behaviour on a * <tt>null</tt> argument depends on the <a * @throws IllegalFormatException * If a format string contains an illegal syntax, a format * specifier that is incompatible with the given arguments, * insufficient arguments given the format string, or other * illegal conditions. For specification of all possible * formatting errors, see the <a * formatter class specification. * @throws NullPointerException * If the <tt>format</tt> is <tt>null</tt> * @return This output stream * A convenience method to write a formatted string to this output stream * using the specified format string and arguments. * <p> An invocation of this method of the form <tt>out.printf(l, format, * args)</tt> behaves in exactly the same way as the invocation * out.format(l, format, args) </pre> * The {@linkplain java.util.Locale locale} to apply during * formatting. If <tt>l</tt> is <tt>null</tt> then no localization * A format string as described in <a * Arguments referenced by the format specifiers in the format * string. If there are more arguments than format specifiers, the * extra arguments are ignored. The number of arguments is * variable and may be zero. The maximum number of arguments is * limited by the maximum dimension of a Java array as defined by * Virtual Machine Specification</a>. The behaviour on a * <tt>null</tt> argument depends on the <a * @throws IllegalFormatException * If a format string contains an illegal syntax, a format * specifier that is incompatible with the given arguments, * insufficient arguments given the format string, or other * illegal conditions. For specification of all possible * formatting errors, see the <a * formatter class specification. * @throws NullPointerException * If the <tt>format</tt> is <tt>null</tt> * @return This output stream * Writes a formatted string to this output stream using the specified * format string and arguments. * <p> The locale always used is the one returned by {@link * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any * previous invocations of other formatting methods on this object. * A format string as described in <a * Arguments referenced by the format specifiers in the format * string. If there are more arguments than format specifiers, the * extra arguments are ignored. The number of arguments is * variable and may be zero. The maximum number of arguments is * limited by the maximum dimension of a Java array as defined by * Virtual Machine Specification</a>. The behaviour on a * <tt>null</tt> argument depends on the <a * @throws IllegalFormatException * If a format string contains an illegal syntax, a format * specifier that is incompatible with the given arguments, * insufficient arguments given the format string, or other * illegal conditions. For specification of all possible * formatting errors, see the <a * formatter class specification. * @throws NullPointerException * If the <tt>format</tt> is <tt>null</tt> * @return This output stream * Writes a formatted string to this output stream using the specified * format string and arguments. * The {@linkplain java.util.Locale locale} to apply during * formatting. If <tt>l</tt> is <tt>null</tt> then no localization * A format string as described in <a * Arguments referenced by the format specifiers in the format * string. If there are more arguments than format specifiers, the * extra arguments are ignored. The number of arguments is * variable and may be zero. The maximum number of arguments is * limited by the maximum dimension of a Java array as defined by * Virtual Machine Specification</a>. The behaviour on a * <tt>null</tt> argument depends on the <a * @throws IllegalFormatException * If a format string contains an illegal syntax, a format * specifier that is incompatible with the given arguments, * insufficient arguments given the format string, or other * illegal conditions. For specification of all possible * formatting errors, see the <a * formatter class specification. * @throws NullPointerException * If the <tt>format</tt> is <tt>null</tt> * @return This output stream * Appends the specified character sequence to this output stream. * <p> An invocation of this method of the form <tt>out.append(csq)</tt> * behaves in exactly the same way as the invocation * out.print(csq.toString()) </pre> * <p> Depending on the specification of <tt>toString</tt> for the * character sequence <tt>csq</tt>, the entire sequence may not be * appended. For instance, invoking then <tt>toString</tt> method of a * character buffer will return a subsequence whose content depends upon * the buffer's position and limit. * The character sequence to append. If <tt>csq</tt> is * <tt>null</tt>, then the four characters <tt>"null"</tt> are * appended to this output stream. * @return This output stream * Appends a subsequence of the specified character sequence to this output * <p> An invocation of this method of the form <tt>out.append(csq, start, * end)</tt> when <tt>csq</tt> is not <tt>null</tt>, behaves in * exactly the same way as the invocation * out.print(csq.subSequence(start, end).toString()) </pre> * The character sequence from which a subsequence will be * appended. If <tt>csq</tt> is <tt>null</tt>, then characters * will be appended as if <tt>csq</tt> contained the four * characters <tt>"null"</tt>. * The index of the first character in the subsequence * The index of the character following the last character in the * @return This output stream * @throws IndexOutOfBoundsException * If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt> * is greater than <tt>end</tt>, or <tt>end</tt> is greater than * Appends the specified character to this output stream. * <p> An invocation of this method of the form <tt>out.append(c)</tt> * behaves in exactly the same way as the invocation * The 16-bit character to append * @return This output stream