• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This code is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 only, as
8  * published by the Free Software Foundation.  Oracle designates this
9  * particular file as subject to the "Classpath" exception as provided
10  * by Oracle in the LICENSE file that accompanied this code.
11  *
12  * This code is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15  * version 2 for more details (a copy is included in the LICENSE file that
16  * accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License version
19  * 2 along with this work; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21  *
22  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23  * or visit www.oracle.com if you need additional information or have any
24  * questions.
25  */
26 
27 package java.io;
28 
29 import java.util.Formatter;
30 import java.util.Locale;
31 import java.nio.charset.Charset;
32 import java.nio.charset.IllegalCharsetNameException;
33 import java.nio.charset.UnsupportedCharsetException;
34 
35 /**
36  * A <code>PrintStream</code> adds functionality to another output stream,
37  * namely the ability to print representations of various data values
38  * conveniently.  Two other features are provided as well.  Unlike other output
39  * streams, a <code>PrintStream</code> never throws an
40  * <code>IOException</code>; instead, exceptional situations merely set an
41  * internal flag that can be tested via the <code>checkError</code> method.
42  * Optionally, a <code>PrintStream</code> can be created so as to flush
43  * automatically; this means that the <code>flush</code> method is
44  * automatically invoked after a byte array is written, one of the
45  * <code>println</code> methods is invoked, or a newline character or byte
46  * (<code>'\n'</code>) is written.
47  *
48  * <p> All characters printed by a <code>PrintStream</code> are converted into
49  * bytes using the platform's default character encoding.  The <code>{@link
50  * PrintWriter}</code> class should be used in situations that require writing
51  * characters rather than bytes.
52  *
53  * @author     Frank Yellin
54  * @author     Mark Reinhold
55  * @since      JDK1.0
56  */
57 
58 public class PrintStream extends FilterOutputStream
59     implements Appendable, Closeable
60 {
61 
62     private final boolean autoFlush;
63     private boolean trouble = false;
64     private Formatter formatter;
65 
66     /**
67      * Track both the text- and character-output streams, so that their buffers
68      * can be flushed without flushing the entire stream.
69      */
70     private BufferedWriter textOut;
71     private OutputStreamWriter charOut;
72 
73     // Android-added: Lazy initialization of charOut and textOut.
74     private Charset charset;
75 
76     /**
77      * requireNonNull is explicitly declared here so as not to create an extra
78      * dependency on java.util.Objects.requireNonNull. PrintStream is loaded
79      * early during system initialization.
80      */
requireNonNull(T obj, String message)81     private static <T> T requireNonNull(T obj, String message) {
82         if (obj == null)
83             throw new NullPointerException(message);
84         return obj;
85     }
86 
87     /**
88      * Returns a charset object for the given charset name.
89      * @throws NullPointerException          is csn is null
90      * @throws UnsupportedEncodingException  if the charset is not supported
91      */
toCharset(String csn)92     private static Charset toCharset(String csn)
93         throws UnsupportedEncodingException
94     {
95         requireNonNull(csn, "charsetName");
96         try {
97             return Charset.forName(csn);
98         } catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {
99             // UnsupportedEncodingException should be thrown
100             throw new UnsupportedEncodingException(csn);
101         }
102     }
103 
104     /* Private constructors */
PrintStream(boolean autoFlush, OutputStream out)105     private PrintStream(boolean autoFlush, OutputStream out) {
106         super(out);
107         this.autoFlush = autoFlush;
108         // Android-changed: Lazy initialization of charOut and textOut.
109         // this.charOut = new OutputStreamWriter(this);
110         // this.textOut = new BufferedWriter(charOut);
111     }
112 
PrintStream(boolean autoFlush, OutputStream out, Charset charset)113     private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {
114         super(out);
115         this.autoFlush = autoFlush;
116         // Android-changed: Lazy initialization of charOut and textOut.
117         // this.charOut = new OutputStreamWriter(this, charset);
118         // this.textOut = new BufferedWriter(charOut);
119         this.charset = charset;
120     }
121 
122     /* Variant of the private constructor so that the given charset name
123      * can be verified before evaluating the OutputStream argument. Used
124      * by constructors creating a FileOutputStream that also take a
125      * charset name.
126      */
PrintStream(boolean autoFlush, Charset charset, OutputStream out)127     private PrintStream(boolean autoFlush, Charset charset, OutputStream out)
128         throws UnsupportedEncodingException
129     {
130         this(autoFlush, out, charset);
131     }
132 
133     /**
134      * Creates a new print stream.  This stream will not flush automatically.
135      *
136      * @param  out        The output stream to which values and objects will be
137      *                    printed
138      *
139      * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream)
140      */
PrintStream(OutputStream out)141     public PrintStream(OutputStream out) {
142         this(out, false);
143     }
144 
145     /**
146      * Creates a new print stream.
147      *
148      * @param  out        The output stream to which values and objects will be
149      *                    printed
150      * @param  autoFlush  A boolean; if true, the output buffer will be flushed
151      *                    whenever a byte array is written, one of the
152      *                    <code>println</code> methods is invoked, or a newline
153      *                    character or byte (<code>'\n'</code>) is written
154      *
155      * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean)
156      */
PrintStream(OutputStream out, boolean autoFlush)157     public PrintStream(OutputStream out, boolean autoFlush) {
158         this(autoFlush, requireNonNull(out, "Null output stream"));
159     }
160 
161     /**
162      * Creates a new print stream.
163      *
164      * @param  out        The output stream to which values and objects will be
165      *                    printed
166      * @param  autoFlush  A boolean; if true, the output buffer will be flushed
167      *                    whenever a byte array is written, one of the
168      *                    <code>println</code> methods is invoked, or a newline
169      *                    character or byte (<code>'\n'</code>) is written
170      * @param  encoding   The name of a supported
171      *                    <a href="../lang/package-summary.html#charenc">
172      *                    character encoding</a>
173      *
174      * @throws  UnsupportedEncodingException
175      *          If the named encoding is not supported
176      *
177      * @since  1.4
178      */
PrintStream(OutputStream out, boolean autoFlush, String encoding)179     public PrintStream(OutputStream out, boolean autoFlush, String encoding)
180         throws UnsupportedEncodingException
181     {
182         this(autoFlush,
183              requireNonNull(out, "Null output stream"),
184              toCharset(encoding));
185     }
186 
187     /**
188      * Creates a new print stream, without automatic line flushing, with the
189      * specified file name.  This convenience constructor creates
190      * the necessary intermediate {@link java.io.OutputStreamWriter
191      * OutputStreamWriter}, which will encode characters using the
192      * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}
193      * for this instance of the Java virtual machine.
194      *
195      * @param  fileName
196      *         The name of the file to use as the destination of this print
197      *         stream.  If the file exists, then it will be truncated to
198      *         zero size; otherwise, a new file will be created.  The output
199      *         will be written to the file and is buffered.
200      *
201      * @throws  FileNotFoundException
202      *          If the given file object does not denote an existing, writable
203      *          regular file and a new regular file of that name cannot be
204      *          created, or if some other error occurs while opening or
205      *          creating the file
206      *
207      * @throws  SecurityException
208      *          If a security manager is present and {@link
209      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
210      *          access to the file
211      *
212      * @since  1.5
213      */
PrintStream(String fileName)214     public PrintStream(String fileName) throws FileNotFoundException {
215         this(false, new FileOutputStream(fileName));
216     }
217 
218     /**
219      * Creates a new print stream, without automatic line flushing, with the
220      * specified file name and charset.  This convenience constructor creates
221      * the necessary intermediate {@link java.io.OutputStreamWriter
222      * OutputStreamWriter}, which will encode characters using the provided
223      * charset.
224      *
225      * @param  fileName
226      *         The name of the file to use as the destination of this print
227      *         stream.  If the file exists, then it will be truncated to
228      *         zero size; otherwise, a new file will be created.  The output
229      *         will be written to the file and is buffered.
230      *
231      * @param  csn
232      *         The name of a supported {@linkplain java.nio.charset.Charset
233      *         charset}
234      *
235      * @throws  FileNotFoundException
236      *          If the given file object does not denote an existing, writable
237      *          regular file and a new regular file of that name cannot be
238      *          created, or if some other error occurs while opening or
239      *          creating the file
240      *
241      * @throws  SecurityException
242      *          If a security manager is present and {@link
243      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
244      *          access to the file
245      *
246      * @throws  UnsupportedEncodingException
247      *          If the named charset is not supported
248      *
249      * @since  1.5
250      */
PrintStream(String fileName, String csn)251     public PrintStream(String fileName, String csn)
252         throws FileNotFoundException, UnsupportedEncodingException
253     {
254         // ensure charset is checked before the file is opened
255         this(false, toCharset(csn), new FileOutputStream(fileName));
256     }
257 
258     /**
259      * Creates a new print stream, without automatic line flushing, with the
260      * specified file.  This convenience constructor creates the necessary
261      * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
262      * which will encode characters using the {@linkplain
263      * java.nio.charset.Charset#defaultCharset() default charset} for this
264      * instance of the Java virtual machine.
265      *
266      * @param  file
267      *         The file to use as the destination of this print stream.  If the
268      *         file exists, then it will be truncated to zero size; otherwise,
269      *         a new file will be created.  The output will be written to the
270      *         file and is buffered.
271      *
272      * @throws  FileNotFoundException
273      *          If the given file object does not denote an existing, writable
274      *          regular file and a new regular file of that name cannot be
275      *          created, or if some other error occurs while opening or
276      *          creating the file
277      *
278      * @throws  SecurityException
279      *          If a security manager is present and {@link
280      *          SecurityManager#checkWrite checkWrite(file.getPath())}
281      *          denies write access to the file
282      *
283      * @since  1.5
284      */
PrintStream(File file)285     public PrintStream(File file) throws FileNotFoundException {
286         this(false, new FileOutputStream(file));
287     }
288 
289     /**
290      * Creates a new print stream, without automatic line flushing, with the
291      * specified file and charset.  This convenience constructor creates
292      * the necessary intermediate {@link java.io.OutputStreamWriter
293      * OutputStreamWriter}, which will encode characters using the provided
294      * charset.
295      *
296      * @param  file
297      *         The file to use as the destination of this print stream.  If the
298      *         file exists, then it will be truncated to zero size; otherwise,
299      *         a new file will be created.  The output will be written to the
300      *         file and is buffered.
301      *
302      * @param  csn
303      *         The name of a supported {@linkplain java.nio.charset.Charset
304      *         charset}
305      *
306      * @throws  FileNotFoundException
307      *          If the given file object does not denote an existing, writable
308      *          regular file and a new regular file of that name cannot be
309      *          created, or if some other error occurs while opening or
310      *          creating the file
311      *
312      * @throws  SecurityException
313      *          If a security manager is present and {@link
314      *          SecurityManager#checkWrite checkWrite(file.getPath())}
315      *          denies write access to the file
316      *
317      * @throws  UnsupportedEncodingException
318      *          If the named charset is not supported
319      *
320      * @since  1.5
321      */
PrintStream(File file, String csn)322     public PrintStream(File file, String csn)
323         throws FileNotFoundException, UnsupportedEncodingException
324     {
325         // ensure charset is checked before the file is opened
326         this(false, toCharset(csn), new FileOutputStream(file));
327     }
328 
329     /** Check to make sure that the stream has not been closed */
ensureOpen()330     private void ensureOpen() throws IOException {
331         if (out == null)
332             throw new IOException("Stream closed");
333     }
334 
335     /**
336      * Flushes the stream.  This is done by writing any buffered output bytes to
337      * the underlying output stream and then flushing that stream.
338      *
339      * @see        java.io.OutputStream#flush()
340      */
flush()341     public void flush() {
342         synchronized (this) {
343             try {
344                 ensureOpen();
345                 out.flush();
346             }
347             catch (IOException x) {
348                 trouble = true;
349             }
350         }
351     }
352 
353     private boolean closing = false; /* To avoid recursive closing */
354 
355     // BEGIN Android-added: Lazy initialization of charOut and textOut.
getTextOut()356     private BufferedWriter getTextOut() {
357         if (textOut == null) {
358             charOut = charset != null ? new OutputStreamWriter(this, charset) :
359                     new OutputStreamWriter(this);
360             textOut = new BufferedWriter(charOut);
361         }
362         return textOut;
363     }
364     // END Android-added: Lazy initialization of charOut and textOut.
365 
366     /**
367      * Closes the stream.  This is done by flushing the stream and then closing
368      * the underlying output stream.
369      *
370      * @see        java.io.OutputStream#close()
371      */
close()372     public void close() {
373         synchronized (this) {
374             if (! closing) {
375                 closing = true;
376                 try {
377                     // BEGIN Android-changed: Lazy initialization of charOut and textOut.
378                     // textOut.close();
379                     if (textOut != null) {
380                         textOut.close();
381                     }
382                     // END Android-changed: Lazy initialization of charOut and textOut.
383                     out.close();
384                 }
385                 catch (IOException x) {
386                     trouble = true;
387                 }
388                 textOut = null;
389                 charOut = null;
390                 out = null;
391             }
392         }
393     }
394 
395     /**
396      * Flushes the stream and checks its error state. The internal error state
397      * is set to <code>true</code> when the underlying output stream throws an
398      * <code>IOException</code> other than <code>InterruptedIOException</code>,
399      * and when the <code>setError</code> method is invoked.  If an operation
400      * on the underlying output stream throws an
401      * <code>InterruptedIOException</code>, then the <code>PrintStream</code>
402      * converts the exception back into an interrupt by doing:
403      * <pre>
404      *     Thread.currentThread().interrupt();
405      * </pre>
406      * or the equivalent.
407      *
408      * @return <code>true</code> if and only if this stream has encountered an
409      *         <code>IOException</code> other than
410      *         <code>InterruptedIOException</code>, or the
411      *         <code>setError</code> method has been invoked
412      */
checkError()413     public boolean checkError() {
414         if (out != null)
415             flush();
416         if (out instanceof java.io.PrintStream) {
417             PrintStream ps = (PrintStream) out;
418             return ps.checkError();
419         }
420         return trouble;
421     }
422 
423     /**
424      * Sets the error state of the stream to <code>true</code>.
425      *
426      * <p> This method will cause subsequent invocations of {@link
427      * #checkError()} to return <tt>true</tt> until {@link
428      * #clearError()} is invoked.
429      *
430      * @since JDK1.1
431      */
setError()432     protected void setError() {
433         trouble = true;
434     }
435 
436     /**
437      * Clears the internal error state of this stream.
438      *
439      * <p> This method will cause subsequent invocations of {@link
440      * #checkError()} to return <tt>false</tt> until another write
441      * operation fails and invokes {@link #setError()}.
442      *
443      * @since 1.6
444      */
clearError()445     protected void clearError() {
446         trouble = false;
447     }
448 
449     /*
450      * Exception-catching, synchronized output operations,
451      * which also implement the write() methods of OutputStream
452      */
453 
454     /**
455      * Writes the specified byte to this stream.  If the byte is a newline and
456      * automatic flushing is enabled then the <code>flush</code> method will be
457      * invoked.
458      *
459      * <p> Note that the byte is written as given; to write a character that
460      * will be translated according to the platform's default character
461      * encoding, use the <code>print(char)</code> or <code>println(char)</code>
462      * methods.
463      *
464      * @param  b  The byte to be written
465      * @see #print(char)
466      * @see #println(char)
467      */
write(int b)468     public void write(int b) {
469         try {
470             synchronized (this) {
471                 ensureOpen();
472                 out.write(b);
473                 if ((b == '\n') && autoFlush)
474                     out.flush();
475             }
476         }
477         catch (InterruptedIOException x) {
478             Thread.currentThread().interrupt();
479         }
480         catch (IOException x) {
481             trouble = true;
482         }
483     }
484 
485     /**
486      * Writes <code>len</code> bytes from the specified byte array starting at
487      * offset <code>off</code> to this stream.  If automatic flushing is
488      * enabled then the <code>flush</code> method will be invoked.
489      *
490      * <p> Note that the bytes will be written as given; to write characters
491      * that will be translated according to the platform's default character
492      * encoding, use the <code>print(char)</code> or <code>println(char)</code>
493      * methods.
494      *
495      * @param  buf   A byte array
496      * @param  off   Offset from which to start taking bytes
497      * @param  len   Number of bytes to write
498      */
write(byte buf[], int off, int len)499     public void write(byte buf[], int off, int len) {
500         try {
501             synchronized (this) {
502                 ensureOpen();
503                 out.write(buf, off, len);
504                 if (autoFlush)
505                     out.flush();
506             }
507         }
508         catch (InterruptedIOException x) {
509             Thread.currentThread().interrupt();
510         }
511         catch (IOException x) {
512             trouble = true;
513         }
514     }
515 
516     /*
517      * The following private methods on the text- and character-output streams
518      * always flush the stream buffers, so that writes to the underlying byte
519      * stream occur as promptly as with the original PrintStream.
520      */
521 
write(char buf[])522     private void write(char buf[]) {
523         try {
524             synchronized (this) {
525                 ensureOpen();
526                 // Android-added: Lazy initialization of charOut and textOut.
527                 BufferedWriter textOut = getTextOut();
528                 textOut.write(buf);
529                 textOut.flushBuffer();
530                 charOut.flushBuffer();
531                 if (autoFlush) {
532                     for (int i = 0; i < buf.length; i++)
533                         if (buf[i] == '\n')
534                             out.flush();
535                 }
536             }
537         }
538         catch (InterruptedIOException x) {
539             Thread.currentThread().interrupt();
540         }
541         catch (IOException x) {
542             trouble = true;
543         }
544     }
545 
write(String s)546     private void write(String s) {
547         try {
548             synchronized (this) {
549                 ensureOpen();
550                 // Android-added: Lazy initialization of charOut and textOut.
551                 BufferedWriter textOut = getTextOut();
552                 textOut.write(s);
553                 textOut.flushBuffer();
554                 charOut.flushBuffer();
555                 if (autoFlush && (s.indexOf('\n') >= 0))
556                     out.flush();
557             }
558         }
559         catch (InterruptedIOException x) {
560             Thread.currentThread().interrupt();
561         }
562         catch (IOException x) {
563             trouble = true;
564         }
565     }
566 
newLine()567     private void newLine() {
568         try {
569             synchronized (this) {
570                 ensureOpen();
571                 // Android-added: Lazy initialization of charOut and textOut.
572                 BufferedWriter textOut = getTextOut();
573                 textOut.newLine();
574                 textOut.flushBuffer();
575                 charOut.flushBuffer();
576                 if (autoFlush)
577                     out.flush();
578             }
579         }
580         catch (InterruptedIOException x) {
581             Thread.currentThread().interrupt();
582         }
583         catch (IOException x) {
584             trouble = true;
585         }
586     }
587 
588     /* Methods that do not terminate lines */
589 
590     /**
591      * Prints a boolean value.  The string produced by <code>{@link
592      * java.lang.String#valueOf(boolean)}</code> is translated into bytes
593      * according to the platform's default character encoding, and these bytes
594      * are written in exactly the manner of the
595      * <code>{@link #write(int)}</code> method.
596      *
597      * @param      b   The <code>boolean</code> to be printed
598      */
print(boolean b)599     public void print(boolean b) {
600         write(b ? "true" : "false");
601     }
602 
603     /**
604      * Prints a character.  The character is translated into one or more bytes
605      * according to the platform's default character encoding, and these bytes
606      * are written in exactly the manner of the
607      * <code>{@link #write(int)}</code> method.
608      *
609      * @param      c   The <code>char</code> to be printed
610      */
print(char c)611     public void print(char c) {
612         write(String.valueOf(c));
613     }
614 
615     /**
616      * Prints an integer.  The string produced by <code>{@link
617      * java.lang.String#valueOf(int)}</code> is translated into bytes
618      * according to the platform's default character encoding, and these bytes
619      * are written in exactly the manner of the
620      * <code>{@link #write(int)}</code> method.
621      *
622      * @param      i   The <code>int</code> to be printed
623      * @see        java.lang.Integer#toString(int)
624      */
print(int i)625     public void print(int i) {
626         write(String.valueOf(i));
627     }
628 
629     /**
630      * Prints a long integer.  The string produced by <code>{@link
631      * java.lang.String#valueOf(long)}</code> is translated into bytes
632      * according to the platform's default character encoding, and these bytes
633      * are written in exactly the manner of the
634      * <code>{@link #write(int)}</code> method.
635      *
636      * @param      l   The <code>long</code> to be printed
637      * @see        java.lang.Long#toString(long)
638      */
print(long l)639     public void print(long l) {
640         write(String.valueOf(l));
641     }
642 
643     /**
644      * Prints a floating-point number.  The string produced by <code>{@link
645      * java.lang.String#valueOf(float)}</code> is translated into bytes
646      * according to the platform's default character encoding, and these bytes
647      * are written in exactly the manner of the
648      * <code>{@link #write(int)}</code> method.
649      *
650      * @param      f   The <code>float</code> to be printed
651      * @see        java.lang.Float#toString(float)
652      */
print(float f)653     public void print(float f) {
654         write(String.valueOf(f));
655     }
656 
657     /**
658      * Prints a double-precision floating-point number.  The string produced by
659      * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
660      * bytes according to the platform's default character encoding, and these
661      * bytes are written in exactly the manner of the <code>{@link
662      * #write(int)}</code> method.
663      *
664      * @param      d   The <code>double</code> to be printed
665      * @see        java.lang.Double#toString(double)
666      */
print(double d)667     public void print(double d) {
668         write(String.valueOf(d));
669     }
670 
671     /**
672      * Prints an array of characters.  The characters are converted into bytes
673      * according to the platform's default character encoding, and these bytes
674      * are written in exactly the manner of the
675      * <code>{@link #write(int)}</code> method.
676      *
677      * @param      s   The array of chars to be printed
678      *
679      * @throws  NullPointerException  If <code>s</code> is <code>null</code>
680      */
print(char s[])681     public void print(char s[]) {
682         write(s);
683     }
684 
685     /**
686      * Prints a string.  If the argument is <code>null</code> then the string
687      * <code>"null"</code> is printed.  Otherwise, the string's characters are
688      * converted into bytes according to the platform's default character
689      * encoding, and these bytes are written in exactly the manner of the
690      * <code>{@link #write(int)}</code> method.
691      *
692      * @param      s   The <code>String</code> to be printed
693      */
print(String s)694     public void print(String s) {
695         if (s == null) {
696             s = "null";
697         }
698         write(s);
699     }
700 
701     /**
702      * Prints an object.  The string produced by the <code>{@link
703      * java.lang.String#valueOf(Object)}</code> method is translated into bytes
704      * according to the platform's default character encoding, and these bytes
705      * are written in exactly the manner of the
706      * <code>{@link #write(int)}</code> method.
707      *
708      * @param      obj   The <code>Object</code> to be printed
709      * @see        java.lang.Object#toString()
710      */
print(Object obj)711     public void print(Object obj) {
712         write(String.valueOf(obj));
713     }
714 
715 
716     /* Methods that do terminate lines */
717 
718     /**
719      * Terminates the current line by writing the line separator string.  The
720      * line separator string is defined by the system property
721      * <code>line.separator</code>, and is not necessarily a single newline
722      * character (<code>'\n'</code>).
723      */
println()724     public void println() {
725         newLine();
726     }
727 
728     /**
729      * Prints a boolean and then terminate the line.  This method behaves as
730      * though it invokes <code>{@link #print(boolean)}</code> and then
731      * <code>{@link #println()}</code>.
732      *
733      * @param x  The <code>boolean</code> to be printed
734      */
println(boolean x)735     public void println(boolean x) {
736         synchronized (this) {
737             print(x);
738             newLine();
739         }
740     }
741 
742     /**
743      * Prints a character and then terminate the line.  This method behaves as
744      * though it invokes <code>{@link #print(char)}</code> and then
745      * <code>{@link #println()}</code>.
746      *
747      * @param x  The <code>char</code> to be printed.
748      */
println(char x)749     public void println(char x) {
750         synchronized (this) {
751             print(x);
752             newLine();
753         }
754     }
755 
756     /**
757      * Prints an integer and then terminate the line.  This method behaves as
758      * though it invokes <code>{@link #print(int)}</code> and then
759      * <code>{@link #println()}</code>.
760      *
761      * @param x  The <code>int</code> to be printed.
762      */
println(int x)763     public void println(int x) {
764         synchronized (this) {
765             print(x);
766             newLine();
767         }
768     }
769 
770     /**
771      * Prints a long and then terminate the line.  This method behaves as
772      * though it invokes <code>{@link #print(long)}</code> and then
773      * <code>{@link #println()}</code>.
774      *
775      * @param x  a The <code>long</code> to be printed.
776      */
println(long x)777     public void println(long x) {
778         synchronized (this) {
779             print(x);
780             newLine();
781         }
782     }
783 
784     /**
785      * Prints a float and then terminate the line.  This method behaves as
786      * though it invokes <code>{@link #print(float)}</code> and then
787      * <code>{@link #println()}</code>.
788      *
789      * @param x  The <code>float</code> to be printed.
790      */
println(float x)791     public void println(float x) {
792         synchronized (this) {
793             print(x);
794             newLine();
795         }
796     }
797 
798     /**
799      * Prints a double and then terminate the line.  This method behaves as
800      * though it invokes <code>{@link #print(double)}</code> and then
801      * <code>{@link #println()}</code>.
802      *
803      * @param x  The <code>double</code> to be printed.
804      */
println(double x)805     public void println(double x) {
806         synchronized (this) {
807             print(x);
808             newLine();
809         }
810     }
811 
812     /**
813      * Prints an array of characters and then terminate the line.  This method
814      * behaves as though it invokes <code>{@link #print(char[])}</code> and
815      * then <code>{@link #println()}</code>.
816      *
817      * @param x  an array of chars to print.
818      */
println(char x[])819     public void println(char x[]) {
820         synchronized (this) {
821             print(x);
822             newLine();
823         }
824     }
825 
826     /**
827      * Prints a String and then terminate the line.  This method behaves as
828      * though it invokes <code>{@link #print(String)}</code> and then
829      * <code>{@link #println()}</code>.
830      *
831      * @param x  The <code>String</code> to be printed.
832      */
println(String x)833     public void println(String x) {
834         synchronized (this) {
835             print(x);
836             newLine();
837         }
838     }
839 
840     /**
841      * Prints an Object and then terminate the line.  This method calls
842      * at first String.valueOf(x) to get the printed object's string value,
843      * then behaves as
844      * though it invokes <code>{@link #print(String)}</code> and then
845      * <code>{@link #println()}</code>.
846      *
847      * @param x  The <code>Object</code> to be printed.
848      */
println(Object x)849     public void println(Object x) {
850         String s = String.valueOf(x);
851         synchronized (this) {
852             print(s);
853             newLine();
854         }
855     }
856 
857 
858     /**
859      * A convenience method to write a formatted string to this output stream
860      * using the specified format string and arguments.
861      *
862      * <p> An invocation of this method of the form <tt>out.printf(format,
863      * args)</tt> behaves in exactly the same way as the invocation
864      *
865      * <pre>
866      *     out.format(format, args) </pre>
867      *
868      * @param  format
869      *         A format string as described in <a
870      *         href="../util/Formatter.html#syntax">Format string syntax</a>
871      *
872      * @param  args
873      *         Arguments referenced by the format specifiers in the format
874      *         string.  If there are more arguments than format specifiers, the
875      *         extra arguments are ignored.  The number of arguments is
876      *         variable and may be zero.  The maximum number of arguments is
877      *         limited by the maximum dimension of a Java array as defined by
878      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
879      *         The behaviour on a
880      *         <tt>null</tt> argument depends on the <a
881      *         href="../util/Formatter.html#syntax">conversion</a>.
882      *
883      * @throws  java.util.IllegalFormatException
884      *          If a format string contains an illegal syntax, a format
885      *          specifier that is incompatible with the given arguments,
886      *          insufficient arguments given the format string, or other
887      *          illegal conditions.  For specification of all possible
888      *          formatting errors, see the <a
889      *          href="../util/Formatter.html#detail">Details</a> section of the
890      *          formatter class specification.
891      *
892      * @throws  NullPointerException
893      *          If the <tt>format</tt> is <tt>null</tt>
894      *
895      * @return  This output stream
896      *
897      * @since  1.5
898      */
printf(String format, Object ... args)899     public PrintStream printf(String format, Object ... args) {
900         return format(format, args);
901     }
902 
903     /**
904      * A convenience method to write a formatted string to this output stream
905      * using the specified format string and arguments.
906      *
907      * <p> An invocation of this method of the form <tt>out.printf(l, format,
908      * args)</tt> behaves in exactly the same way as the invocation
909      *
910      * <pre>
911      *     out.format(l, format, args) </pre>
912      *
913      * @param  l
914      *         The {@linkplain java.util.Locale locale} to apply during
915      *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
916      *         is applied.
917      *
918      * @param  format
919      *         A format string as described in <a
920      *         href="../util/Formatter.html#syntax">Format string syntax</a>
921      *
922      * @param  args
923      *         Arguments referenced by the format specifiers in the format
924      *         string.  If there are more arguments than format specifiers, the
925      *         extra arguments are ignored.  The number of arguments is
926      *         variable and may be zero.  The maximum number of arguments is
927      *         limited by the maximum dimension of a Java array as defined by
928      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
929      *         The behaviour on a
930      *         <tt>null</tt> argument depends on the <a
931      *         href="../util/Formatter.html#syntax">conversion</a>.
932      *
933      * @throws  java.util.IllegalFormatException
934      *          If a format string contains an illegal syntax, a format
935      *          specifier that is incompatible with the given arguments,
936      *          insufficient arguments given the format string, or other
937      *          illegal conditions.  For specification of all possible
938      *          formatting errors, see the <a
939      *          href="../util/Formatter.html#detail">Details</a> section of the
940      *          formatter class specification.
941      *
942      * @throws  NullPointerException
943      *          If the <tt>format</tt> is <tt>null</tt>
944      *
945      * @return  This output stream
946      *
947      * @since  1.5
948      */
printf(Locale l, String format, Object ... args)949     public PrintStream printf(Locale l, String format, Object ... args) {
950         return format(l, format, args);
951     }
952 
953     /**
954      * Writes a formatted string to this output stream using the specified
955      * format string and arguments.
956      *
957      * <p> The locale always used is the one returned by {@link
958      * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any
959      * previous invocations of other formatting methods on this object.
960      *
961      * @param  format
962      *         A format string as described in <a
963      *         href="../util/Formatter.html#syntax">Format string syntax</a>
964      *
965      * @param  args
966      *         Arguments referenced by the format specifiers in the format
967      *         string.  If there are more arguments than format specifiers, the
968      *         extra arguments are ignored.  The number of arguments is
969      *         variable and may be zero.  The maximum number of arguments is
970      *         limited by the maximum dimension of a Java array as defined by
971      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
972      *         The behaviour on a
973      *         <tt>null</tt> argument depends on the <a
974      *         href="../util/Formatter.html#syntax">conversion</a>.
975      *
976      * @throws  java.util.IllegalFormatException
977      *          If a format string contains an illegal syntax, a format
978      *          specifier that is incompatible with the given arguments,
979      *          insufficient arguments given the format string, or other
980      *          illegal conditions.  For specification of all possible
981      *          formatting errors, see the <a
982      *          href="../util/Formatter.html#detail">Details</a> section of the
983      *          formatter class specification.
984      *
985      * @throws  NullPointerException
986      *          If the <tt>format</tt> is <tt>null</tt>
987      *
988      * @return  This output stream
989      *
990      * @since  1.5
991      */
format(String format, Object ... args)992     public PrintStream format(String format, Object ... args) {
993         try {
994             synchronized (this) {
995                 ensureOpen();
996                 if ((formatter == null)
997                     || (formatter.locale() != Locale.getDefault()))
998                     formatter = new Formatter((Appendable) this);
999                 formatter.format(Locale.getDefault(), format, args);
1000             }
1001         } catch (InterruptedIOException x) {
1002             Thread.currentThread().interrupt();
1003         } catch (IOException x) {
1004             trouble = true;
1005         }
1006         return this;
1007     }
1008 
1009     /**
1010      * Writes a formatted string to this output stream using the specified
1011      * format string and arguments.
1012      *
1013      * @param  l
1014      *         The {@linkplain java.util.Locale locale} to apply during
1015      *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
1016      *         is applied.
1017      *
1018      * @param  format
1019      *         A format string as described in <a
1020      *         href="../util/Formatter.html#syntax">Format string syntax</a>
1021      *
1022      * @param  args
1023      *         Arguments referenced by the format specifiers in the format
1024      *         string.  If there are more arguments than format specifiers, the
1025      *         extra arguments are ignored.  The number of arguments is
1026      *         variable and may be zero.  The maximum number of arguments is
1027      *         limited by the maximum dimension of a Java array as defined by
1028      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
1029      *         The behaviour on a
1030      *         <tt>null</tt> argument depends on the <a
1031      *         href="../util/Formatter.html#syntax">conversion</a>.
1032      *
1033      * @throws  java.util.IllegalFormatException
1034      *          If a format string contains an illegal syntax, a format
1035      *          specifier that is incompatible with the given arguments,
1036      *          insufficient arguments given the format string, or other
1037      *          illegal conditions.  For specification of all possible
1038      *          formatting errors, see the <a
1039      *          href="../util/Formatter.html#detail">Details</a> section of the
1040      *          formatter class specification.
1041      *
1042      * @throws  NullPointerException
1043      *          If the <tt>format</tt> is <tt>null</tt>
1044      *
1045      * @return  This output stream
1046      *
1047      * @since  1.5
1048      */
format(Locale l, String format, Object ... args)1049     public PrintStream format(Locale l, String format, Object ... args) {
1050         try {
1051             synchronized (this) {
1052                 ensureOpen();
1053                 if ((formatter == null)
1054                     || (formatter.locale() != l))
1055                     formatter = new Formatter(this, l);
1056                 formatter.format(l, format, args);
1057             }
1058         } catch (InterruptedIOException x) {
1059             Thread.currentThread().interrupt();
1060         } catch (IOException x) {
1061             trouble = true;
1062         }
1063         return this;
1064     }
1065 
1066     /**
1067      * Appends the specified character sequence to this output stream.
1068      *
1069      * <p> An invocation of this method of the form <tt>out.append(csq)</tt>
1070      * behaves in exactly the same way as the invocation
1071      *
1072      * <pre>
1073      *     out.print(csq.toString()) </pre>
1074      *
1075      * <p> Depending on the specification of <tt>toString</tt> for the
1076      * character sequence <tt>csq</tt>, the entire sequence may not be
1077      * appended.  For instance, invoking then <tt>toString</tt> method of a
1078      * character buffer will return a subsequence whose content depends upon
1079      * the buffer's position and limit.
1080      *
1081      * @param  csq
1082      *         The character sequence to append.  If <tt>csq</tt> is
1083      *         <tt>null</tt>, then the four characters <tt>"null"</tt> are
1084      *         appended to this output stream.
1085      *
1086      * @return  This output stream
1087      *
1088      * @since  1.5
1089      */
append(CharSequence csq)1090     public PrintStream append(CharSequence csq) {
1091         if (csq == null)
1092             print("null");
1093         else
1094             print(csq.toString());
1095         return this;
1096     }
1097 
1098     /**
1099      * Appends a subsequence of the specified character sequence to this output
1100      * stream.
1101      *
1102      * <p> An invocation of this method of the form <tt>out.append(csq, start,
1103      * end)</tt> when <tt>csq</tt> is not <tt>null</tt>, behaves in
1104      * exactly the same way as the invocation
1105      *
1106      * <pre>
1107      *     out.print(csq.subSequence(start, end).toString()) </pre>
1108      *
1109      * @param  csq
1110      *         The character sequence from which a subsequence will be
1111      *         appended.  If <tt>csq</tt> is <tt>null</tt>, then characters
1112      *         will be appended as if <tt>csq</tt> contained the four
1113      *         characters <tt>"null"</tt>.
1114      *
1115      * @param  start
1116      *         The index of the first character in the subsequence
1117      *
1118      * @param  end
1119      *         The index of the character following the last character in the
1120      *         subsequence
1121      *
1122      * @return  This output stream
1123      *
1124      * @throws  IndexOutOfBoundsException
1125      *          If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt>
1126      *          is greater than <tt>end</tt>, or <tt>end</tt> is greater than
1127      *          <tt>csq.length()</tt>
1128      *
1129      * @since  1.5
1130      */
append(CharSequence csq, int start, int end)1131     public PrintStream append(CharSequence csq, int start, int end) {
1132         CharSequence cs = (csq == null ? "null" : csq);
1133         write(cs.subSequence(start, end).toString());
1134         return this;
1135     }
1136 
1137     /**
1138      * Appends the specified character to this output stream.
1139      *
1140      * <p> An invocation of this method of the form <tt>out.append(c)</tt>
1141      * behaves in exactly the same way as the invocation
1142      *
1143      * <pre>
1144      *     out.print(c) </pre>
1145      *
1146      * @param  c
1147      *         The 16-bit character to append
1148      *
1149      * @return  This output stream
1150      *
1151      * @since  1.5
1152      */
append(char c)1153     public PrintStream append(char c) {
1154         print(c);
1155         return this;
1156     }
1157 
1158 }
1159