1 /*
2  * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */

25
26 package java.io;
27
28 import java.util.Formatter;
29 import java.util.Locale;
30 import java.nio.charset.Charset;
31 import java.nio.charset.IllegalCharsetNameException;
32 import java.nio.charset.UnsupportedCharsetException;
33
34 /**
35  * A {@code PrintStream} adds functionality to another output stream,
36  * namely the ability to print representations of various data values
37  * conveniently.  Two other features are provided as well.  Unlike other output
38  * streams, a {@code PrintStream} never throws an
39  * {@code IOException}; instead, exceptional situations merely set an
40  * internal flag that can be tested via the {@code checkError} method.
41  * Optionally, a {@code PrintStream} can be created so as to flush
42  * automatically; this means that the {@code flush} method is
43  * automatically invoked after a byte array is written, one of the
44  * {@code println} methods is invoked, or a newline character or byte
45  * ({@code '\n'}) is written.
46  *
47  * <p> All characters printed by a {@code PrintStream} are converted into
48  * bytes using the given encoding or charset, or platform's default character
49  * encoding if not specified.
50  * The {@link PrintWriter} class should be used in situations that require
51  *  writing characters rather than bytes.
52  *
53  * <p> This class always replaces malformed and unmappable character sequences with
54  * the charset's default replacement string.
55  * The {@linkplain java.nio.charset.CharsetEncoder} class should be used when more
56  * control over the encoding process is required.
57  *
58  * @author     Frank Yellin
59  * @author     Mark Reinhold
60  * @since      1.0
61  */

62
63 public class PrintStream extends FilterOutputStream
64     implements Appendable, Closeable
65 {
66
67     private final boolean autoFlush;
68     private boolean trouble = false;
69     private Formatter formatter;
70
71     /**
72      * Track both the text- and character-output streams, so that their buffers
73      * can be flushed without flushing the entire stream.
74      */

75     private BufferedWriter textOut;
76     private OutputStreamWriter charOut;
77
78     /**
79      * requireNonNull is explicitly declared here so as not to create an extra
80      * dependency on java.util.Objects.requireNonNull. PrintStream is loaded
81      * early during system initialization.
82      */

83     private static <T> T requireNonNull(T obj, String message) {
84         if (obj == null)
85             throw new NullPointerException(message);
86         return obj;
87     }
88
89     /**
90      * Returns a charset object for the given charset name.
91      * @throws NullPointerException          is csn is null
92      * @throws UnsupportedEncodingException  if the charset is not supported
93      */

94     private static Charset toCharset(String csn)
95         throws UnsupportedEncodingException
96     {
97         requireNonNull(csn, "charsetName");
98         try {
99             return Charset.forName(csn);
100         } catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {
101             // UnsupportedEncodingException should be thrown
102             throw new UnsupportedEncodingException(csn);
103         }
104     }
105
106     /* Private constructors */
107     private PrintStream(boolean autoFlush, OutputStream out) {
108         super(out);
109         this.autoFlush = autoFlush;
110         this.charOut = new OutputStreamWriter(this);
111         this.textOut = new BufferedWriter(charOut);
112     }
113
114     /* Variant of the private constructor so that the given charset name
115      * can be verified before evaluating the OutputStream argument. Used
116      * by constructors creating a FileOutputStream that also take a
117      * charset name.
118      */

119     private PrintStream(boolean autoFlush, Charset charset, OutputStream out) {
120         this(out, autoFlush, charset);
121     }
122
123     /**
124      * Creates a new print stream.  This stream will not flush automatically.
125      *
126      * @param  out        The output stream to which values and objects will be
127      *                    printed
128      *
129      * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream)
130      */

131     public PrintStream(OutputStream out) {
132         this(out, false);
133     }
134
135     /**
136      * Creates a new print stream.
137      *
138      * @param  out        The output stream to which values and objects will be
139      *                    printed
140      * @param  autoFlush  A booleanif true, the output buffer will be flushed
141      *                    whenever a byte array is written, one of the
142      *                    {@code println} methods is invoked, or a newline
143      *                    character or byte ({@code '\n'}) is written
144      *
145      * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean)
146      */

147     public PrintStream(OutputStream out, boolean autoFlush) {
148         this(autoFlush, requireNonNull(out, "Null output stream"));
149     }
150
151     /**
152      * Creates a new print stream.
153      *
154      * @param  out        The output stream to which values and objects will be
155      *                    printed
156      * @param  autoFlush  A booleanif true, the output buffer will be flushed
157      *                    whenever a byte array is written, one of the
158      *                    {@code println} methods is invoked, or a newline
159      *                    character or byte ({@code '\n'}) is written
160      * @param  encoding   The name of a supported
161      *                    <a href="../lang/package-summary.html#charenc">
162      *                    character encoding</a>
163      *
164      * @throws  UnsupportedEncodingException
165      *          If the named encoding is not supported
166      *
167      * @since  1.4
168      */

169     public PrintStream(OutputStream out, boolean autoFlush, String encoding)
170         throws UnsupportedEncodingException
171     {
172         this(requireNonNull(out, "Null output stream"), autoFlush, toCharset(encoding));
173     }
174
175     /**
176      * Creates a new print stream, with the specified OutputStream, automatic line
177      * flushing and charset.  This convenience constructor creates the necessary
178      * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
179      * which will encode characters using the provided charset.
180      *
181      * @param  out        The output stream to which values and objects will be
182      *                    printed
183      * @param  autoFlush  A booleanif true, the output buffer will be flushed
184      *                    whenever a byte array is written, one of the
185      *                    {@code println} methods is invoked, or a newline
186      *                    character or byte ({@code '\n'}) is written
187      * @param  charset    A {@linkplain java.nio.charset.Charset charset}
188      *
189      * @since  10
190      */

191     public PrintStream(OutputStream out, boolean autoFlush, Charset charset) {
192         super(out);
193         this.autoFlush = autoFlush;
194         this.charOut = new OutputStreamWriter(this, charset);
195         this.textOut = new BufferedWriter(charOut);
196     }
197
198     /**
199      * Creates a new print stream, without automatic line flushing, with the
200      * specified file name.  This convenience constructor creates
201      * the necessary intermediate {@link java.io.OutputStreamWriter
202      * OutputStreamWriter}, which will encode characters using the
203      * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}
204      * for this instance of the Java virtual machine.
205      *
206      * @param  fileName
207      *         The name of the file to use as the destination of this print
208      *         stream.  If the file exists, then it will be truncated to
209      *         zero size; otherwise, a new file will be created.  The output
210      *         will be written to the file and is buffered.
211      *
212      * @throws  FileNotFoundException
213      *          If the given file object does not denote an existing, writable
214      *          regular file and a new regular file of that name cannot be
215      *          created, or if some other error occurs while opening or
216      *          creating the file
217      *
218      * @throws  SecurityException
219      *          If a security manager is present and {@link
220      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
221      *          access to the file
222      *
223      * @since  1.5
224      */

225     public PrintStream(String fileName) throws FileNotFoundException {
226         this(falsenew FileOutputStream(fileName));
227     }
228
229     /**
230      * Creates a new print stream, without automatic line flushing, with the
231      * specified file name and charset.  This convenience constructor creates
232      * the necessary intermediate {@link java.io.OutputStreamWriter
233      * OutputStreamWriter}, which will encode characters using the provided
234      * charset.
235      *
236      * @param  fileName
237      *         The name of the file to use as the destination of this print
238      *         stream.  If the file exists, then it will be truncated to
239      *         zero size; otherwise, a new file will be created.  The output
240      *         will be written to the file and is buffered.
241      *
242      * @param  csn
243      *         The name of a supported {@linkplain java.nio.charset.Charset
244      *         charset}
245      *
246      * @throws  FileNotFoundException
247      *          If the given file object does not denote an existing, writable
248      *          regular file and a new regular file of that name cannot be
249      *          created, or if some other error occurs while opening or
250      *          creating the file
251      *
252      * @throws  SecurityException
253      *          If a security manager is present and {@link
254      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
255      *          access to the file
256      *
257      * @throws  UnsupportedEncodingException
258      *          If the named charset is not supported
259      *
260      * @since  1.5
261      */

262     public PrintStream(String fileName, String csn)
263         throws FileNotFoundException, UnsupportedEncodingException
264     {
265         // ensure charset is checked before the file is opened
266         this(false, toCharset(csn), new FileOutputStream(fileName));
267     }
268
269     /**
270      * Creates a new print stream, without automatic line flushing, with the
271      * specified file name and charset.  This convenience constructor creates
272      * the necessary intermediate {@link java.io.OutputStreamWriter
273      * OutputStreamWriter}, which will encode characters using the provided
274      * charset.
275      *
276      * @param  fileName
277      *         The name of the file to use as the destination of this print
278      *         stream.  If the file exists, then it will be truncated to
279      *         zero size; otherwise, a new file will be created.  The output
280      *         will be written to the file and is buffered.
281      *
282      * @param  charset
283      *         A {@linkplain java.nio.charset.Charset charset}
284      *
285      * @throws  IOException
286      *          if an I/O error occurs while opening or creating the file
287      *
288      * @throws  SecurityException
289      *          If a security manager is present and {@link
290      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
291      *          access to the file
292      *
293      * @since  10
294      */

295     public PrintStream(String fileName, Charset charset) throws IOException {
296         this(false, requireNonNull(charset, "charset"), new FileOutputStream(fileName));
297     }
298
299     /**
300      * Creates a new print stream, without automatic line flushing, with the
301      * specified file.  This convenience constructor creates the necessary
302      * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
303      * which will encode characters using the {@linkplain
304      * java.nio.charset.Charset#defaultCharset() default charset} for this
305      * instance of the Java virtual machine.
306      *
307      * @param  file
308      *         The file to use as the destination of this print stream.  If the
309      *         file exists, then it will be truncated to zero size; otherwise,
310      *         a new file will be created.  The output will be written to the
311      *         file and is buffered.
312      *
313      * @throws  FileNotFoundException
314      *          If the given file object does not denote an existing, writable
315      *          regular file and a new regular file of that name cannot be
316      *          created, or if some other error occurs while opening or
317      *          creating the file
318      *
319      * @throws  SecurityException
320      *          If a security manager is present and {@link
321      *          SecurityManager#checkWrite checkWrite(file.getPath())}
322      *          denies write access to the file
323      *
324      * @since  1.5
325      */

326     public PrintStream(File file) throws FileNotFoundException {
327         this(falsenew FileOutputStream(file));
328     }
329
330     /**
331      * Creates a new print stream, without automatic line flushing, with the
332      * specified file and charset.  This convenience constructor creates
333      * the necessary intermediate {@link java.io.OutputStreamWriter
334      * OutputStreamWriter}, which will encode characters using the provided
335      * charset.
336      *
337      * @param  file
338      *         The file to use as the destination of this print stream.  If the
339      *         file exists, then it will be truncated to zero size; otherwise,
340      *         a new file will be created.  The output will be written to the
341      *         file and is buffered.
342      *
343      * @param  csn
344      *         The name of a supported {@linkplain java.nio.charset.Charset
345      *         charset}
346      *
347      * @throws  FileNotFoundException
348      *          If the given file object does not denote an existing, writable
349      *          regular file and a new regular file of that name cannot be
350      *          created, or if some other error occurs while opening or
351      *          creating the file
352      *
353      * @throws  SecurityException
354      *          If a security manager is present and {@link
355      *          SecurityManager#checkWrite checkWrite(file.getPath())}
356      *          denies write access to the file
357      *
358      * @throws  UnsupportedEncodingException
359      *          If the named charset is not supported
360      *
361      * @since  1.5
362      */

363     public PrintStream(File file, String csn)
364         throws FileNotFoundException, UnsupportedEncodingException
365     {
366         // ensure charset is checked before the file is opened
367         this(false, toCharset(csn), new FileOutputStream(file));
368     }
369
370
371     /**
372      * Creates a new print stream, without automatic line flushing, with the
373      * specified file and charset.  This convenience constructor creates
374      * the necessary intermediate {@link java.io.OutputStreamWriter
375      * OutputStreamWriter}, which will encode characters using the provided
376      * charset.
377      *
378      * @param  file
379      *         The file to use as the destination of this print stream.  If the
380      *         file exists, then it will be truncated to zero size; otherwise,
381      *         a new file will be created.  The output will be written to the
382      *         file and is buffered.
383      *
384      * @param  charset
385      *         A {@linkplain java.nio.charset.Charset charset}
386      *
387      * @throws  IOException
388      *          if an I/O error occurs while opening or creating the file
389      *
390      * @throws  SecurityException
391      *          If a security manager is present and {@link
392      *          SecurityManager#checkWrite checkWrite(file.getPath())}
393      *          denies write access to the file
394      *
395      * @since  10
396      */

397     public PrintStream(File file, Charset charset) throws IOException {
398         this(false, requireNonNull(charset, "charset"), new FileOutputStream(file));
399     }
400
401     /** Check to make sure that the stream has not been closed */
402     private void ensureOpen() throws IOException {
403         if (out == null)
404             throw new IOException("Stream closed");
405     }
406
407     /**
408      * Flushes the stream.  This is done by writing any buffered output bytes to
409      * the underlying output stream and then flushing that stream.
410      *
411      * @see        java.io.OutputStream#flush()
412      */

413     public void flush() {
414         synchronized (this) {
415             try {
416                 ensureOpen();
417                 out.flush();
418             }
419             catch (IOException x) {
420                 trouble = true;
421             }
422         }
423     }
424
425     private boolean closing = false/* To avoid recursive closing */
426
427     /**
428      * Closes the stream.  This is done by flushing the stream and then closing
429      * the underlying output stream.
430      *
431      * @see        java.io.OutputStream#close()
432      */

433     public void close() {
434         synchronized (this) {
435             if (! closing) {
436                 closing = true;
437                 try {
438                     textOut.close();
439                     out.close();
440                 }
441                 catch (IOException x) {
442                     trouble = true;
443                 }
444                 textOut = null;
445                 charOut = null;
446                 out = null;
447             }
448         }
449     }
450
451     /**
452      * Flushes the stream and checks its error state. The internal error state
453      * is set to {@code true} when the underlying output stream throws an
454      * {@code IOException} other than {@code InterruptedIOException},
455      * and when the {@code setError} method is invoked.  If an operation
456      * on the underlying output stream throws an
457      * {@code InterruptedIOException}, then the {@code PrintStream}
458      * converts the exception back into an interrupt by doing:
459      * <pre>{@code
460      *     Thread.currentThread().interrupt();
461      * }</pre>
462      * or the equivalent.
463      *
464      * @return {@code trueif and only if this stream has encountered an
465      *         {@code IOException} other than
466      *         {@code InterruptedIOException}, or the
467      *         {@code setError} method has been invoked
468      */

469     public boolean checkError() {
470         if (out != null)
471             flush();
472         if (out instanceof java.io.PrintStream) {
473             PrintStream ps = (PrintStream) out;
474             return ps.checkError();
475         }
476         return trouble;
477     }
478
479     /**
480      * Sets the error state of the stream to {@code true}.
481      *
482      * <p> This method will cause subsequent invocations of {@link
483      * #checkError()} to return {@code true} until
484      * {@link #clearError()} is invoked.
485      *
486      * @since 1.1
487      */

488     protected void setError() {
489         trouble = true;
490     }
491
492     /**
493      * Clears the internal error state of this stream.
494      *
495      * <p> This method will cause subsequent invocations of {@link
496      * #checkError()} to return {@code false} until another write
497      * operation fails and invokes {@link #setError()}.
498      *
499      * @since 1.6
500      */

501     protected void clearError() {
502         trouble = false;
503     }
504
505     /*
506      * Exception-catching, synchronized output operations,
507      * which also implement the write() methods of OutputStream
508      */

509
510     /**
511      * Writes the specified byte to this stream.  If the byte is a newline and
512      * automatic flushing is enabled then the {@code flush} method will be
513      * invoked.
514      *
515      * <p> Note that the byte is written as given; to write a character that
516      * will be translated according to the platform's default character
517      * encoding, use the {@code print(char)} or {@code println(char)}
518      * methods.
519      *
520      * @param  b  The byte to be written
521      * @see #print(char)
522      * @see #println(char)
523      */

524     public void write(int b) {
525         try {
526             synchronized (this) {
527                 ensureOpen();
528                 out.write(b);
529                 if ((b == '\n') && autoFlush)
530                     out.flush();
531             }
532         }
533         catch (InterruptedIOException x) {
534             Thread.currentThread().interrupt();
535         }
536         catch (IOException x) {
537             trouble = true;
538         }
539     }
540
541     /**
542      * Writes {@code len} bytes from the specified byte array starting at
543      * offset {@code off} to this stream.  If automatic flushing is
544      * enabled then the {@code flush} method will be invoked.
545      *
546      * <p> Note that the bytes will be written as given; to write characters
547      * that will be translated according to the platform's default character
548      * encoding, use the {@code print(char)} or {@code println(char)}
549      * methods.
550      *
551      * @param  buf   A byte array
552      * @param  off   Offset from which to start taking bytes
553      * @param  len   Number of bytes to write
554      */

555     public void write(byte buf[], int off, int len) {
556         try {
557             synchronized (this) {
558                 ensureOpen();
559                 out.write(buf, off, len);
560                 if (autoFlush)
561                     out.flush();
562             }
563         }
564         catch (InterruptedIOException x) {
565             Thread.currentThread().interrupt();
566         }
567         catch (IOException x) {
568             trouble = true;
569         }
570     }
571
572     /*
573      * The following private methods on the text- and character-output streams
574      * always flush the stream buffers, so that writes to the underlying byte
575      * stream occur as promptly as with the original PrintStream.
576      */

577
578     private void write(char buf[]) {
579         try {
580             synchronized (this) {
581                 ensureOpen();
582                 textOut.write(buf);
583                 textOut.flushBuffer();
584                 charOut.flushBuffer();
585                 if (autoFlush) {
586                     for (int i = 0; i < buf.length; i++)
587                         if (buf[i] == '\n')
588                             out.flush();
589                 }
590             }
591         }
592         catch (InterruptedIOException x) {
593             Thread.currentThread().interrupt();
594         }
595         catch (IOException x) {
596             trouble = true;
597         }
598     }
599
600     private void write(String s) {
601         try {
602             synchronized (this) {
603                 ensureOpen();
604                 textOut.write(s);
605                 textOut.flushBuffer();
606                 charOut.flushBuffer();
607                 if (autoFlush && (s.indexOf('\n') >= 0))
608                     out.flush();
609             }
610         }
611         catch (InterruptedIOException x) {
612             Thread.currentThread().interrupt();
613         }
614         catch (IOException x) {
615             trouble = true;
616         }
617     }
618
619     private void newLine() {
620         try {
621             synchronized (this) {
622                 ensureOpen();
623                 textOut.newLine();
624                 textOut.flushBuffer();
625                 charOut.flushBuffer();
626                 if (autoFlush)
627                     out.flush();
628             }
629         }
630         catch (InterruptedIOException x) {
631             Thread.currentThread().interrupt();
632         }
633         catch (IOException x) {
634             trouble = true;
635         }
636     }
637
638     /* Methods that do not terminate lines */
639
640     /**
641      * Prints a boolean value.  The string produced by {@link
642      * java.lang.String#valueOf(boolean)} is translated into bytes
643      * according to the platform's default character encoding, and these bytes
644      * are written in exactly the manner of the
645      * {@link #write(int)} method.
646      *
647      * @param      b   The {@code boolean} to be printed
648      */

649     public void print(boolean b) {
650         write(String.valueOf(b));
651     }
652
653     /**
654      * Prints a character.  The character is translated into one or more bytes
655      * according to the platform's default character encoding, and these bytes
656      * are written in exactly the manner of the
657      * {@link #write(int)} method.
658      *
659      * @param      c   The {@code char} to be printed
660      */

661     public void print(char c) {
662         write(String.valueOf(c));
663     }
664
665     /**
666      * Prints an integer.  The string produced by {@link
667      * java.lang.String#valueOf(int)} is translated into bytes
668      * according to the platform's default character encoding, and these bytes
669      * are written in exactly the manner of the
670      * {@link #write(int)} method.
671      *
672      * @param      i   The {@code int} to be printed
673      * @see        java.lang.Integer#toString(int)
674      */

675     public void print(int i) {
676         write(String.valueOf(i));
677     }
678
679     /**
680      * Prints a long integer.  The string produced by {@link
681      * java.lang.String#valueOf(long)} is translated into bytes
682      * according to the platform's default character encoding, and these bytes
683      * are written in exactly the manner of the
684      * {@link #write(int)} method.
685      *
686      * @param      l   The {@code long} to be printed
687      * @see        java.lang.Long#toString(long)
688      */

689     public void print(long l) {
690         write(String.valueOf(l));
691     }
692
693     /**
694      * Prints a floating-point number.  The string produced by {@link
695      * java.lang.String#valueOf(float)} is translated into bytes
696      * according to the platform's default character encoding, and these bytes
697      * are written in exactly the manner of the
698      * {@link #write(int)} method.
699      *
700      * @param      f   The {@code float} to be printed
701      * @see        java.lang.Float#toString(float)
702      */

703     public void print(float f) {
704         write(String.valueOf(f));
705     }
706
707     /**
708      * Prints a double-precision floating-point number.  The string produced by
709      * {@link java.lang.String#valueOf(double)} is translated into
710      * bytes according to the platform's default character encoding, and these
711      * bytes are written in exactly the manner of the {@link
712      * #write(int)} method.
713      *
714      * @param      d   The {@code double} to be printed
715      * @see        java.lang.Double#toString(double)
716      */

717     public void print(double d) {
718         write(String.valueOf(d));
719     }
720
721     /**
722      * Prints an array of characters.  The characters are converted into bytes
723      * according to the platform's default character encoding, and these bytes
724      * are written in exactly the manner of the
725      * {@link #write(int)} method.
726      *
727      * @param      s   The array of chars to be printed
728      *
729      * @throws  NullPointerException  If {@code s} is {@code null}
730      */

731     public void print(char s[]) {
732         write(s);
733     }
734
735     /**
736      * Prints a string.  If the argument is {@code null} then the string
737      * {@code "null"} is printed.  Otherwise, the string's characters are
738      * converted into bytes according to the platform's default character
739      * encoding, and these bytes are written in exactly the manner of the
740      * {@link #write(int)} method.
741      *
742      * @param      s   The {@code String} to be printed
743      */

744     public void print(String s) {
745         write(String.valueOf(s));
746     }
747
748     /**
749      * Prints an object.  The string produced by the {@link
750      * java.lang.String#valueOf(Object)} method is translated into bytes
751      * according to the platform's default character encoding, and these bytes
752      * are written in exactly the manner of the
753      * {@link #write(int)} method.
754      *
755      * @param      obj   The {@code Object} to be printed
756      * @see        java.lang.Object#toString()
757      */

758     public void print(Object obj) {
759         write(String.valueOf(obj));
760     }
761
762
763     /* Methods that do terminate lines */
764
765     /**
766      * Terminates the current line by writing the line separator string.  The
767      * line separator string is defined by the system property
768      * {@code line.separator}, and is not necessarily a single newline
769      * character ({@code '\n'}).
770      */

771     public void println() {
772         newLine();
773     }
774
775     /**
776      * Prints a boolean and then terminate the line.  This method behaves as
777      * though it invokes {@link #print(boolean)} and then
778      * {@link #println()}.
779      *
780      * @param x  The {@code boolean} to be printed
781      */

782     public void println(boolean x) {
783         synchronized (this) {
784             print(x);
785             newLine();
786         }
787     }
788
789     /**
790      * Prints a character and then terminate the line.  This method behaves as
791      * though it invokes {@link #print(char)} and then
792      * {@link #println()}.
793      *
794      * @param x  The {@code char} to be printed.
795      */

796     public void println(char x) {
797         synchronized (this) {
798             print(x);
799             newLine();
800         }
801     }
802
803     /**
804      * Prints an integer and then terminate the line.  This method behaves as
805      * though it invokes {@link #print(int)} and then
806      * {@link #println()}.
807      *
808      * @param x  The {@code int} to be printed.
809      */

810     public void println(int x) {
811         synchronized (this) {
812             print(x);
813             newLine();
814         }
815     }
816
817     /**
818      * Prints a long and then terminate the line.  This method behaves as
819      * though it invokes {@link #print(long)} and then
820      * {@link #println()}.
821      *
822      * @param x  a The {@code long} to be printed.
823      */

824     public void println(long x) {
825         synchronized (this) {
826             print(x);
827             newLine();
828         }
829     }
830
831     /**
832      * Prints a float and then terminate the line.  This method behaves as
833      * though it invokes {@link #print(float)} and then
834      * {@link #println()}.
835      *
836      * @param x  The {@code float} to be printed.
837      */

838     public void println(float x) {
839         synchronized (this) {
840             print(x);
841             newLine();
842         }
843     }
844
845     /**
846      * Prints a double and then terminate the line.  This method behaves as
847      * though it invokes {@link #print(double)} and then
848      * {@link #println()}.
849      *
850      * @param x  The {@code double} to be printed.
851      */

852     public void println(double x) {
853         synchronized (this) {
854             print(x);
855             newLine();
856         }
857     }
858
859     /**
860      * Prints an array of characters and then terminate the line.  This method
861      * behaves as though it invokes {@link #print(char[])} and
862      * then {@link #println()}.
863      *
864      * @param x  an array of chars to print.
865      */

866     public void println(char x[]) {
867         synchronized (this) {
868             print(x);
869             newLine();
870         }
871     }
872
873     /**
874      * Prints a String and then terminate the line.  This method behaves as
875      * though it invokes {@link #print(String)} and then
876      * {@link #println()}.
877      *
878      * @param x  The {@code String} to be printed.
879      */

880     public void println(String x) {
881         synchronized (this) {
882             print(x);
883             newLine();
884         }
885     }
886
887     /**
888      * Prints an Object and then terminate the line.  This method calls
889      * at first String.valueOf(x) to get the printed object's string value,
890      * then behaves as
891      * though it invokes {@link #print(String)} and then
892      * {@link #println()}.
893      *
894      * @param x  The {@code Object} to be printed.
895      */

896     public void println(Object x) {
897         String s = String.valueOf(x);
898         synchronized (this) {
899             print(s);
900             newLine();
901         }
902     }
903
904
905     /**
906      * A convenience method to write a formatted string to this output stream
907      * using the specified format string and arguments.
908      *
909      * <p> An invocation of this method of the form
910      * {@code out.printf(format, args)} behaves
911      * in exactly the same way as the invocation
912      *
913      * <pre>{@code
914      *     out.format(format, args)
915      * }</pre>
916      *
917      * @param  format
918      *         A format string as described in <a
919      *         href="../util/Formatter.html#syntax">Format string syntax</a>
920      *
921      * @param  args
922      *         Arguments referenced by the format specifiers in the format
923      *         string.  If there are more arguments than format specifiers, the
924      *         extra arguments are ignored.  The number of arguments is
925      *         variable and may be zero.  The maximum number of arguments is
926      *         limited by the maximum dimension of a Java array as defined by
927      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
928      *         The behaviour on a
929      *         {@code null} argument depends on the <a
930      *         href="../util/Formatter.html#syntax">conversion</a>.
931      *
932      * @throws  java.util.IllegalFormatException
933      *          If a format string contains an illegal syntax, a format
934      *          specifier that is incompatible with the given arguments,
935      *          insufficient arguments given the format string, or other
936      *          illegal conditions.  For specification of all possible
937      *          formatting errors, see the <a
938      *          href="../util/Formatter.html#detail">Details</a> section of the
939      *          formatter class specification.
940      *
941      * @throws  NullPointerException
942      *          If the {@code format} is {@code null}
943      *
944      * @return  This output stream
945      *
946      * @since  1.5
947      */

948     public PrintStream printf(String format, Object ... args) {
949         return format(format, args);
950     }
951
952     /**
953      * A convenience method to write a formatted string to this output stream
954      * using the specified format string and arguments.
955      *
956      * <p> An invocation of this method of the form
957      * {@code out.printf(l, format, args)} behaves
958      * in exactly the same way as the invocation
959      *
960      * <pre>{@code
961      *     out.format(l, format, args)
962      * }</pre>
963      *
964      * @param  l
965      *         The {@linkplain java.util.Locale locale} to apply during
966      *         formatting.  If {@code l} is {@code null} then no localization
967      *         is applied.
968      *
969      * @param  format
970      *         A format string as described in <a
971      *         href="../util/Formatter.html#syntax">Format string syntax</a>
972      *
973      * @param  args
974      *         Arguments referenced by the format specifiers in the format
975      *         string.  If there are more arguments than format specifiers, the
976      *         extra arguments are ignored.  The number of arguments is
977      *         variable and may be zero.  The maximum number of arguments is
978      *         limited by the maximum dimension of a Java array as defined by
979      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
980      *         The behaviour on a
981      *         {@code null} argument depends on the <a
982      *         href="../util/Formatter.html#syntax">conversion</a>.
983      *
984      * @throws  java.util.IllegalFormatException
985      *          If a format string contains an illegal syntax, a format
986      *          specifier that is incompatible with the given arguments,
987      *          insufficient arguments given the format string, or other
988      *          illegal conditions.  For specification of all possible
989      *          formatting errors, see the <a
990      *          href="../util/Formatter.html#detail">Details</a> section of the
991      *          formatter class specification.
992      *
993      * @throws  NullPointerException
994      *          If the {@code format} is {@code null}
995      *
996      * @return  This output stream
997      *
998      * @since  1.5
999      */

1000     public PrintStream printf(Locale l, String format, Object ... args) {
1001         return format(l, format, args);
1002     }
1003
1004     /**
1005      * Writes a formatted string to this output stream using the specified
1006      * format string and arguments.
1007      *
1008      * <p> The locale always used is the one returned by {@link
1009      * java.util.Locale#getDefault(Locale.Category)} with
1010      * {@link java.util.Locale.Category#FORMAT FORMAT} category specified,
1011      * regardless of any previous invocations of other formatting methods on
1012      * this object.
1013      *
1014      * @param  format
1015      *         A format string as described in <a
1016      *         href="../util/Formatter.html#syntax">Format string syntax</a>
1017      *
1018      * @param  args
1019      *         Arguments referenced by the format specifiers in the format
1020      *         string.  If there are more arguments than format specifiers, the
1021      *         extra arguments are ignored.  The number of arguments is
1022      *         variable and may be zero.  The maximum number of arguments is
1023      *         limited by the maximum dimension of a Java array as defined by
1024      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
1025      *         The behaviour on a
1026      *         {@code null} argument depends on the <a
1027      *         href="../util/Formatter.html#syntax">conversion</a>.
1028      *
1029      * @throws  java.util.IllegalFormatException
1030      *          If a format string contains an illegal syntax, a format
1031      *          specifier that is incompatible with the given arguments,
1032      *          insufficient arguments given the format string, or other
1033      *          illegal conditions.  For specification of all possible
1034      *          formatting errors, see the <a
1035      *          href="../util/Formatter.html#detail">Details</a> section of the
1036      *          formatter class specification.
1037      *
1038      * @throws  NullPointerException
1039      *          If the {@code format} is {@code null}
1040      *
1041      * @return  This output stream
1042      *
1043      * @since  1.5
1044      */

1045     public PrintStream format(String format, Object ... args) {
1046         try {
1047             synchronized (this) {
1048                 ensureOpen();
1049                 if ((formatter == null)
1050                     || (formatter.locale() !=
1051                         Locale.getDefault(Locale.Category.FORMAT)))
1052                     formatter = new Formatter((Appendable) this);
1053                 formatter.format(Locale.getDefault(Locale.Category.FORMAT),
1054                                  format, args);
1055             }
1056         } catch (InterruptedIOException x) {
1057             Thread.currentThread().interrupt();
1058         } catch (IOException x) {
1059             trouble = true;
1060         }
1061         return this;
1062     }
1063
1064     /**
1065      * Writes a formatted string to this output stream using the specified
1066      * format string and arguments.
1067      *
1068      * @param  l
1069      *         The {@linkplain java.util.Locale locale} to apply during
1070      *         formatting.  If {@code l} is {@code null} then no localization
1071      *         is applied.
1072      *
1073      * @param  format
1074      *         A format string as described in <a
1075      *         href="../util/Formatter.html#syntax">Format string syntax</a>
1076      *
1077      * @param  args
1078      *         Arguments referenced by the format specifiers in the format
1079      *         string.  If there are more arguments than format specifiers, the
1080      *         extra arguments are ignored.  The number of arguments is
1081      *         variable and may be zero.  The maximum number of arguments is
1082      *         limited by the maximum dimension of a Java array as defined by
1083      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
1084      *         The behaviour on a
1085      *         {@code null} argument depends on the <a
1086      *         href="../util/Formatter.html#syntax">conversion</a>.
1087      *
1088      * @throws  java.util.IllegalFormatException
1089      *          If a format string contains an illegal syntax, a format
1090      *          specifier that is incompatible with the given arguments,
1091      *          insufficient arguments given the format string, or other
1092      *          illegal conditions.  For specification of all possible
1093      *          formatting errors, see the <a
1094      *          href="../util/Formatter.html#detail">Details</a> section of the
1095      *          formatter class specification.
1096      *
1097      * @throws  NullPointerException
1098      *          If the {@code format} is {@code null}
1099      *
1100      * @return  This output stream
1101      *
1102      * @since  1.5
1103      */

1104     public PrintStream format(Locale l, String format, Object ... args) {
1105         try {
1106             synchronized (this) {
1107                 ensureOpen();
1108                 if ((formatter == null)
1109                     || (formatter.locale() != l))
1110                     formatter = new Formatter(this, l);
1111                 formatter.format(l, format, args);
1112             }
1113         } catch (InterruptedIOException x) {
1114             Thread.currentThread().interrupt();
1115         } catch (IOException x) {
1116             trouble = true;
1117         }
1118         return this;
1119     }
1120
1121     /**
1122      * Appends the specified character sequence to this output stream.
1123      *
1124      * <p> An invocation of this method of the form {@code out.append(csq)}
1125      * behaves in exactly the same way as the invocation
1126      *
1127      * <pre>{@code
1128      *     out.print(csq.toString())
1129      * }</pre>
1130      *
1131      * <p> Depending on the specification of {@code toString} for the
1132      * character sequence {@code csq}, the entire sequence may not be
1133      * appended.  For instance, invoking then {@code toString} method of a
1134      * character buffer will return a subsequence whose content depends upon
1135      * the buffer's position and limit.
1136      *
1137      * @param  csq
1138      *         The character sequence to append.  If {@code csq} is
1139      *         {@code null}, then the four characters {@code "null"} are
1140      *         appended to this output stream.
1141      *
1142      * @return  This output stream
1143      *
1144      * @since  1.5
1145      */

1146     public PrintStream append(CharSequence csq) {
1147         print(String.valueOf(csq));
1148         return this;
1149     }
1150
1151     /**
1152      * Appends a subsequence of the specified character sequence to this output
1153      * stream.
1154      *
1155      * <p> An invocation of this method of the form
1156      * {@code out.append(csq, start, end)} when
1157      * {@code csq} is not {@code null}, behaves in
1158      * exactly the same way as the invocation
1159      *
1160      * <pre>{@code
1161      *     out.print(csq.subSequence(start, end).toString())
1162      * }</pre>
1163      *
1164      * @param  csq
1165      *         The character sequence from which a subsequence will be
1166      *         appended.  If {@code csq} is {@code null}, then characters
1167      *         will be appended as if {@code csq} contained the four
1168      *         characters {@code "null"}.
1169      *
1170      * @param  start
1171      *         The index of the first character in the subsequence
1172      *
1173      * @param  end
1174      *         The index of the character following the last character in the
1175      *         subsequence
1176      *
1177      * @return  This output stream
1178      *
1179      * @throws  IndexOutOfBoundsException
1180      *          If {@code start} or {@code end} are negative, {@code start}
1181      *          is greater than {@code end}, or {@code end} is greater than
1182      *          {@code csq.length()}
1183      *
1184      * @since  1.5
1185      */

1186     public PrintStream append(CharSequence csq, int start, int end) {
1187         if (csq == null) csq = "null";
1188         return append(csq.subSequence(start, end));
1189     }
1190
1191     /**
1192      * Appends the specified character to this output stream.
1193      *
1194      * <p> An invocation of this method of the form {@code out.append(c)}
1195      * behaves in exactly the same way as the invocation
1196      *
1197      * <pre>{@code
1198      *     out.print(c)
1199      * }</pre>
1200      *
1201      * @param  c
1202      *         The 16-bit character to append
1203      *
1204      * @return  This output stream
1205      *
1206      * @since  1.5
1207      */

1208     public PrintStream append(char c) {
1209         print(c);
1210         return this;
1211     }
1212
1213 }
1214