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.Objects;
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  * Prints formatted representations of objects to a text-output stream.  This
37  * class implements all of the {@code print} methods found in {@link
38  * PrintStream}.  It does not contain methods for writing raw bytes, for which
39  * a program should use unencoded byte streams.
40  *
41  * <p> Unlike the {@link PrintStream} classif automatic flushing is enabled
42  * it will be done only when one of the {@code println}, {@code printf}, or
43  * {@code format} methods is invoked, rather than whenever a newline character
44  * happens to be output.  These methods use the platform's own notion of line
45  * separator rather than the newline character.
46  *
47  * <p> Methods in this class never throw I/O exceptions, although some of its
48  * constructors may.  The client may inquire as to whether any errors have
49  * occurred by invoking {@link #checkError checkError()}.
50  *
51  * <p> This class always replaces malformed and unmappable character sequences with
52  * the charset's default replacement string.
53  * The {@linkplain java.nio.charset.CharsetEncoder} class should be used when more
54  * control over the encoding process is required.
55  *
56  * @author      Frank Yellin
57  * @author      Mark Reinhold
58  * @since       1.1
59  */

60
61 public class PrintWriter extends Writer {
62
63     /**
64      * The underlying character-output stream of this
65      * {@code PrintWriter}.
66      *
67      * @since 1.2
68      */

69     protected Writer out;
70
71     private final boolean autoFlush;
72     private boolean trouble = false;
73     private Formatter formatter;
74     private PrintStream psOut = null;
75
76     /**
77      * Returns a charset object for the given charset name.
78      * @throws NullPointerException          is csn is null
79      * @throws UnsupportedEncodingException  if the charset is not supported
80      */

81     private static Charset toCharset(String csn)
82         throws UnsupportedEncodingException
83     {
84         Objects.requireNonNull(csn, "charsetName");
85         try {
86             return Charset.forName(csn);
87         } catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {
88             // UnsupportedEncodingException should be thrown
89             throw new UnsupportedEncodingException(csn);
90         }
91     }
92
93     /**
94      * Creates a new PrintWriter, without automatic line flushing.
95      *
96      * @param  out        A character-output stream
97      */

98     public PrintWriter (Writer out) {
99         this(out, false);
100     }
101
102     /**
103      * Creates a new PrintWriter.
104      *
105      * @param  out        A character-output stream
106      * @param  autoFlush  A booleanif true, the {@code println},
107      *                    {@code printf}, or {@code format} methods will
108      *                    flush the output buffer
109      */

110     public PrintWriter(Writer out,
111                        boolean autoFlush) {
112         super(out);
113         this.out = out;
114         this.autoFlush = autoFlush;
115     }
116
117     /**
118      * Creates a new PrintWriter, without automatic line flushing, from an
119      * existing OutputStream.  This convenience constructor creates the
120      * necessary intermediate OutputStreamWriter, which will convert characters
121      * into bytes using the default character encoding.
122      *
123      * @param  out        An output stream
124      *
125      * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
126      */

127     public PrintWriter(OutputStream out) {
128         this(out, false);
129     }
130
131     /**
132      * Creates a new PrintWriter from an existing OutputStream.  This
133      * convenience constructor creates the necessary intermediate
134      * OutputStreamWriter, which will convert characters into bytes using the
135      * default character encoding.
136      *
137      * @param  out        An output stream
138      * @param  autoFlush  A booleanif true, the {@code println},
139      *                    {@code printf}, or {@code format} methods will
140      *                    flush the output buffer
141      *
142      * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
143      */

144     public PrintWriter(OutputStream out, boolean autoFlush) {
145         this(out, autoFlush, Charset.defaultCharset());
146     }
147
148     /**
149      * Creates a new PrintWriter from an existing OutputStream.  This
150      * convenience constructor creates the necessary intermediate
151      * OutputStreamWriter, which will convert characters into bytes using the
152      * specified charset.
153      *
154      * @param  out        An output stream
155      * @param  autoFlush  A booleanif true, the {@code println},
156      *                    {@code printf}, or {@code format} methods will
157      *                    flush the output buffer
158      * @param  charset
159      *         A {@linkplain java.nio.charset.Charset charset}
160      *
161      * @since 10
162      */

163     public PrintWriter(OutputStream out, boolean autoFlush, Charset charset) {
164         this(new BufferedWriter(new OutputStreamWriter(out, charset)), autoFlush);
165
166         // save print stream for error propagation
167         if (out instanceof java.io.PrintStream) {
168             psOut = (PrintStream) out;
169         }
170     }
171
172     /**
173      * Creates a new PrintWriter, without automatic line flushing, with the
174      * specified file name.  This convenience constructor creates the necessary
175      * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
176      * which will encode characters using the {@linkplain
177      * java.nio.charset.Charset#defaultCharset() default charset} for this
178      * instance of the Java virtual machine.
179      *
180      * @param  fileName
181      *         The name of the file to use as the destination of this writer.
182      *         If the file exists then it will be truncated to zero size;
183      *         otherwise, a new file will be created.  The output will be
184      *         written to the file and is buffered.
185      *
186      * @throws  FileNotFoundException
187      *          If the given string does not denote an existing, writable
188      *          regular file and a new regular file of that name cannot be
189      *          created, or if some other error occurs while opening or
190      *          creating the file
191      *
192      * @throws  SecurityException
193      *          If a security manager is present and {@link
194      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
195      *          access to the file
196      *
197      * @since  1.5
198      */

199     public PrintWriter(String fileName) throws FileNotFoundException {
200         this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName))),
201              false);
202     }
203
204     /* Private constructor */
205     private PrintWriter(Charset charset, File file)
206         throws FileNotFoundException
207     {
208         this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset)),
209              false);
210     }
211
212     /**
213      * Creates a new PrintWriter, without automatic line flushing, with the
214      * specified file name and charset.  This convenience constructor creates
215      * the necessary intermediate {@link java.io.OutputStreamWriter
216      * OutputStreamWriter}, which will encode characters using the provided
217      * charset.
218      *
219      * @param  fileName
220      *         The name of the file to use as the destination of this writer.
221      *         If the file exists then it will be truncated to zero size;
222      *         otherwise, a new file will be created.  The output will be
223      *         written to the file and is buffered.
224      *
225      * @param  csn
226      *         The name of a supported {@linkplain java.nio.charset.Charset
227      *         charset}
228      *
229      * @throws  FileNotFoundException
230      *          If the given string does not denote an existing, writable
231      *          regular file and a new regular file of that name cannot be
232      *          created, or if some other error occurs while opening or
233      *          creating the file
234      *
235      * @throws  SecurityException
236      *          If a security manager is present and {@link
237      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
238      *          access to the file
239      *
240      * @throws  UnsupportedEncodingException
241      *          If the named charset is not supported
242      *
243      * @since  1.5
244      */

245     public PrintWriter(String fileName, String csn)
246         throws FileNotFoundException, UnsupportedEncodingException
247     {
248         this(toCharset(csn), new File(fileName));
249     }
250
251     /**
252      * Creates a new PrintWriter, without automatic line flushing, with the
253      * specified file name and charset.  This convenience constructor creates
254      * the necessary intermediate {@link java.io.OutputStreamWriter
255      * OutputStreamWriter}, which will encode characters using the provided
256      * charset.
257      *
258      * @param  fileName
259      *         The name of the file to use as the destination of this writer.
260      *         If the file exists then it will be truncated to zero size;
261      *         otherwise, a new file will be created.  The output will be
262      *         written to the file and is buffered.
263      *
264      * @param  charset
265      *         A {@linkplain java.nio.charset.Charset charset}
266      *
267      * @throws  IOException
268      *          if an I/O error occurs while opening or creating the file
269      *
270      * @throws  SecurityException
271      *          If a security manager is present and {@link
272      *          SecurityManager#checkWrite checkWrite(fileName)} denies write
273      *          access to the file
274      *
275      * @since  10
276      */

277     public PrintWriter(String fileName, Charset charset) throws IOException {
278         this(Objects.requireNonNull(charset, "charset"), new File(fileName));
279     }
280
281     /**
282      * Creates a new PrintWriter, without automatic line flushing, with the
283      * specified file.  This convenience constructor creates the necessary
284      * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
285      * which will encode characters using the {@linkplain
286      * java.nio.charset.Charset#defaultCharset() default charset} for this
287      * instance of the Java virtual machine.
288      *
289      * @param  file
290      *         The file to use as the destination of this writer.  If the file
291      *         exists then it will be truncated to zero size; otherwise, a new
292      *         file will be created.  The output will be written to the file
293      *         and is buffered.
294      *
295      * @throws  FileNotFoundException
296      *          If the given file object does not denote an existing, writable
297      *          regular file and a new regular file of that name cannot be
298      *          created, or if some other error occurs while opening or
299      *          creating the file
300      *
301      * @throws  SecurityException
302      *          If a security manager is present and {@link
303      *          SecurityManager#checkWrite checkWrite(file.getPath())}
304      *          denies write access to the file
305      *
306      * @since  1.5
307      */

308     public PrintWriter(File file) throws FileNotFoundException {
309         this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
310              false);
311     }
312
313     /**
314      * Creates a new PrintWriter, without automatic line flushing, with the
315      * specified file and charset.  This convenience constructor creates the
316      * necessary intermediate {@link java.io.OutputStreamWriter
317      * OutputStreamWriter}, which will encode characters using the provided
318      * charset.
319      *
320      * @param  file
321      *         The file to use as the destination of this writer.  If the file
322      *         exists then it will be truncated to zero size; otherwise, a new
323      *         file will be created.  The output will be written to the file
324      *         and is buffered.
325      *
326      * @param  csn
327      *         The name of a supported {@linkplain java.nio.charset.Charset
328      *         charset}
329      *
330      * @throws  FileNotFoundException
331      *          If the given file object does not denote an existing, writable
332      *          regular file and a new regular file of that name cannot be
333      *          created, or if some other error occurs while opening or
334      *          creating the file
335      *
336      * @throws  SecurityException
337      *          If a security manager is present and {@link
338      *          SecurityManager#checkWrite checkWrite(file.getPath())}
339      *          denies write access to the file
340      *
341      * @throws  UnsupportedEncodingException
342      *          If the named charset is not supported
343      *
344      * @since  1.5
345      */

346     public PrintWriter(File file, String csn)
347         throws FileNotFoundException, UnsupportedEncodingException
348     {
349         this(toCharset(csn), file);
350     }
351
352     /**
353      * Creates a new PrintWriter, without automatic line flushing, with the
354      * specified file and charset.  This convenience constructor creates the
355      * necessary intermediate {@link java.io.OutputStreamWriter
356      * OutputStreamWriter}, which will encode characters using the provided
357      * charset.
358      *
359      * @param  file
360      *         The file to use as the destination of this writer.  If the file
361      *         exists then it will be truncated to zero size; otherwise, a new
362      *         file will be created.  The output will be written to the file
363      *         and is buffered.
364      *
365      * @param  charset
366      *         A {@linkplain java.nio.charset.Charset charset}
367      *
368      * @throws  IOException
369      *          if an I/O error occurs while opening or creating the file
370      *
371      * @throws  SecurityException
372      *          If a security manager is present and {@link
373      *          SecurityManager#checkWrite checkWrite(file.getPath())}
374      *          denies write access to the file
375      *
376      * @since  10
377      */

378     public PrintWriter(File file, Charset charset) throws IOException {
379         this(Objects.requireNonNull(charset, "charset"), file);
380     }
381
382     /** Checks to make sure that the stream has not been closed */
383     private void ensureOpen() throws IOException {
384         if (out == null)
385             throw new IOException("Stream closed");
386     }
387
388     /**
389      * Flushes the stream.
390      * @see #checkError()
391      */

392     public void flush() {
393         try {
394             synchronized (lock) {
395                 ensureOpen();
396                 out.flush();
397             }
398         }
399         catch (IOException x) {
400             trouble = true;
401         }
402     }
403
404     /**
405      * Closes the stream and releases any system resources associated
406      * with it. Closing a previously closed stream has no effect.
407      *
408      * @see #checkError()
409      */

410     public void close() {
411         try {
412             synchronized (lock) {
413                 if (out == null)
414                     return;
415                 out.close();
416                 out = null;
417             }
418         }
419         catch (IOException x) {
420             trouble = true;
421         }
422     }
423
424     /**
425      * Flushes the stream if it's not closed and checks its error state.
426      *
427      * @return {@code trueif the print stream has encountered an error,
428      *          either on the underlying output stream or during a format
429      *          conversion.
430      */

431     public boolean checkError() {
432         if (out != null) {
433             flush();
434         }
435         if (out instanceof java.io.PrintWriter) {
436             PrintWriter pw = (PrintWriter) out;
437             return pw.checkError();
438         } else if (psOut != null) {
439             return psOut.checkError();
440         }
441         return trouble;
442     }
443
444     /**
445      * Indicates that an error has occurred.
446      *
447      * <p> This method will cause subsequent invocations of {@link
448      * #checkError()} to return {@code true} until {@link
449      * #clearError()} is invoked.
450      */

451     protected void setError() {
452         trouble = true;
453     }
454
455     /**
456      * Clears the error state of this stream.
457      *
458      * <p> This method will cause subsequent invocations of {@link
459      * #checkError()} to return {@code false} until another write
460      * operation fails and invokes {@link #setError()}.
461      *
462      * @since 1.6
463      */

464     protected void clearError() {
465         trouble = false;
466     }
467
468     /*
469      * Exception-catching, synchronized output operations,
470      * which also implement the write() methods of Writer
471      */

472
473     /**
474      * Writes a single character.
475      * @param c int specifying a character to be written.
476      */

477     public void write(int c) {
478         try {
479             synchronized (lock) {
480                 ensureOpen();
481                 out.write(c);
482             }
483         }
484         catch (InterruptedIOException x) {
485             Thread.currentThread().interrupt();
486         }
487         catch (IOException x) {
488             trouble = true;
489         }
490     }
491
492     /**
493      * Writes A Portion of an array of characters.
494      * @param buf Array of characters
495      * @param off Offset from which to start writing characters
496      * @param len Number of characters to write
497      *
498      * @throws  IndexOutOfBoundsException
499      *          If the values of the {@code off} and {@code len} parameters
500      *          cause the corresponding method of the underlying {@code Writer}
501      *          to throw an {@code IndexOutOfBoundsException}
502      */

503     public void write(char buf[], int off, int len) {
504         try {
505             synchronized (lock) {
506                 ensureOpen();
507                 out.write(buf, off, len);
508             }
509         }
510         catch (InterruptedIOException x) {
511             Thread.currentThread().interrupt();
512         }
513         catch (IOException x) {
514             trouble = true;
515         }
516     }
517
518     /**
519      * Writes an array of characters.  This method cannot be inherited from the
520      * Writer class because it must suppress I/O exceptions.
521      * @param buf Array of characters to be written
522      */

523     public void write(char buf[]) {
524         write(buf, 0, buf.length);
525     }
526
527     /**
528      * Writes a portion of a string.
529      * @param s A String
530      * @param off Offset from which to start writing characters
531      * @param len Number of characters to write
532      *
533      * @throws  IndexOutOfBoundsException
534      *          If the values of the {@code off} and {@code len} parameters
535      *          cause the corresponding method of the underlying {@code Writer}
536      *          to throw an {@code IndexOutOfBoundsException}
537      */

538     public void write(String s, int off, int len) {
539         try {
540             synchronized (lock) {
541                 ensureOpen();
542                 out.write(s, off, len);
543             }
544         }
545         catch (InterruptedIOException x) {
546             Thread.currentThread().interrupt();
547         }
548         catch (IOException x) {
549             trouble = true;
550         }
551     }
552
553     /**
554      * Writes a string.  This method cannot be inherited from the Writer class
555      * because it must suppress I/O exceptions.
556      * @param s String to be written
557      */

558     public void write(String s) {
559         write(s, 0, s.length());
560     }
561
562     private void newLine() {
563         try {
564             synchronized (lock) {
565                 ensureOpen();
566                 out.write(System.lineSeparator());
567                 if (autoFlush)
568                     out.flush();
569             }
570         }
571         catch (InterruptedIOException x) {
572             Thread.currentThread().interrupt();
573         }
574         catch (IOException x) {
575             trouble = true;
576         }
577     }
578
579     /* Methods that do not terminate lines */
580
581     /**
582      * Prints a boolean value.  The string produced by {@link
583      * java.lang.String#valueOf(boolean)} is translated into bytes
584      * according to the platform's default character encoding, and these bytes
585      * are written in exactly the manner of the {@link
586      * #write(int)} method.
587      *
588      * @param      b   The {@code boolean} to be printed
589      */

590     public void print(boolean b) {
591         write(String.valueOf(b));
592     }
593
594     /**
595      * Prints a character.  The character is translated into one or more bytes
596      * according to the platform's default character encoding, and these bytes
597      * are written in exactly the manner of the {@link
598      * #write(int)} method.
599      *
600      * @param      c   The {@code char} to be printed
601      */

602     public void print(char c) {
603         write(c);
604     }
605
606     /**
607      * Prints an integer.  The string produced by {@link
608      * java.lang.String#valueOf(int)} is translated into bytes according
609      * to the platform's default character encoding, and these bytes are
610      * written in exactly the manner of the {@link #write(int)}
611      * method.
612      *
613      * @param      i   The {@code int} to be printed
614      * @see        java.lang.Integer#toString(int)
615      */

616     public void print(int i) {
617         write(String.valueOf(i));
618     }
619
620     /**
621      * Prints a long integer.  The string produced by {@link
622      * java.lang.String#valueOf(long)} is translated into bytes
623      * according to the platform's default character encoding, and these bytes
624      * are written in exactly the manner of the {@link #write(int)}
625      * method.
626      *
627      * @param      l   The {@code long} to be printed
628      * @see        java.lang.Long#toString(long)
629      */

630     public void print(long l) {
631         write(String.valueOf(l));
632     }
633
634     /**
635      * Prints a floating-point number.  The string produced by {@link
636      * java.lang.String#valueOf(float)} is translated into bytes
637      * according to the platform's default character encoding, and these bytes
638      * are written in exactly the manner of the {@link #write(int)}
639      * method.
640      *
641      * @param      f   The {@code float} to be printed
642      * @see        java.lang.Float#toString(float)
643      */

644     public void print(float f) {
645         write(String.valueOf(f));
646     }
647
648     /**
649      * Prints a double-precision floating-point number.  The string produced by
650      * {@link java.lang.String#valueOf(double)} is translated into
651      * bytes according to the platform's default character encoding, and these
652      * bytes are written in exactly the manner of the {@link
653      * #write(int)} method.
654      *
655      * @param      d   The {@code double} to be printed
656      * @see        java.lang.Double#toString(double)
657      */

658     public void print(double d) {
659         write(String.valueOf(d));
660     }
661
662     /**
663      * Prints an array of characters.  The characters are converted into bytes
664      * according to the platform's default character encoding, and these bytes
665      * are written in exactly the manner of the {@link #write(int)}
666      * method.
667      *
668      * @param      s   The array of chars to be printed
669      *
670      * @throws  NullPointerException  If {@code s} is {@code null}
671      */

672     public void print(char s[]) {
673         write(s);
674     }
675
676     /**
677      * Prints a string.  If the argument is {@code null} then the string
678      * {@code "null"} is printed.  Otherwise, the string's characters are
679      * converted into bytes according to the platform's default character
680      * encoding, and these bytes are written in exactly the manner of the
681      * {@link #write(int)} method.
682      *
683      * @param      s   The {@code String} to be printed
684      */

685     public void print(String s) {
686         write(String.valueOf(s));
687     }
688
689     /**
690      * Prints an object.  The string produced by the {@link
691      * java.lang.String#valueOf(Object)} method is translated into bytes
692      * according to the platform's default character encoding, and these bytes
693      * are written in exactly the manner of the {@link #write(int)}
694      * method.
695      *
696      * @param      obj   The {@code Object} to be printed
697      * @see        java.lang.Object#toString()
698      */

699     public void print(Object obj) {
700         write(String.valueOf(obj));
701     }
702
703     /* Methods that do terminate lines */
704
705     /**
706      * Terminates the current line by writing the line separator string.  The
707      * line separator string is defined by the system property
708      * {@code line.separator}, and is not necessarily a single newline
709      * character ({@code '\n'}).
710      */

711     public void println() {
712         newLine();
713     }
714
715     /**
716      * Prints a boolean value and then terminates the line.  This method behaves
717      * as though it invokes {@link #print(boolean)} and then
718      * {@link #println()}.
719      *
720      * @param x the {@code boolean} value to be printed
721      */

722     public void println(boolean x) {
723         synchronized (lock) {
724             print(x);
725             println();
726         }
727     }
728
729     /**
730      * Prints a character and then terminates the line.  This method behaves as
731      * though it invokes {@link #print(char)} and then {@link
732      * #println()}.
733      *
734      * @param x the {@code char} value to be printed
735      */

736     public void println(char x) {
737         synchronized (lock) {
738             print(x);
739             println();
740         }
741     }
742
743     /**
744      * Prints an integer and then terminates the line.  This method behaves as
745      * though it invokes {@link #print(int)} and then {@link
746      * #println()}.
747      *
748      * @param x the {@code int} value to be printed
749      */

750     public void println(int x) {
751         synchronized (lock) {
752             print(x);
753             println();
754         }
755     }
756
757     /**
758      * Prints a long integer and then terminates the line.  This method behaves
759      * as though it invokes {@link #print(long)} and then
760      * {@link #println()}.
761      *
762      * @param x the {@code long} value to be printed
763      */

764     public void println(long x) {
765         synchronized (lock) {
766             print(x);
767             println();
768         }
769     }
770
771     /**
772      * Prints a floating-point number and then terminates the line.  This method
773      * behaves as though it invokes {@link #print(float)} and then
774      * {@link #println()}.
775      *
776      * @param x the {@code float} value to be printed
777      */

778     public void println(float x) {
779         synchronized (lock) {
780             print(x);
781             println();
782         }
783     }
784
785     /**
786      * Prints a double-precision floating-point number and then terminates the
787      * line.  This method behaves as though it invokes {@link
788      * #print(double)} and then {@link #println()}.
789      *
790      * @param x the {@code double} value to be printed
791      */

792     public void println(double x) {
793         synchronized (lock) {
794             print(x);
795             println();
796         }
797     }
798
799     /**
800      * Prints an array of characters and then terminates the line.  This method
801      * behaves as though it invokes {@link #print(char[])} and then
802      * {@link #println()}.
803      *
804      * @param x the array of {@code char} values to be printed
805      */

806     public void println(char x[]) {
807         synchronized (lock) {
808             print(x);
809             println();
810         }
811     }
812
813     /**
814      * Prints a String and then terminates the line.  This method behaves as
815      * though it invokes {@link #print(String)} and then
816      * {@link #println()}.
817      *
818      * @param x the {@code String} value to be printed
819      */

820     public void println(String x) {
821         synchronized (lock) {
822             print(x);
823             println();
824         }
825     }
826
827     /**
828      * Prints an Object and then terminates the line.  This method calls
829      * at first String.valueOf(x) to get the printed object's string value,
830      * then behaves as
831      * though it invokes {@link #print(String)} and then
832      * {@link #println()}.
833      *
834      * @param x  The {@code Object} to be printed.
835      */

836     public void println(Object x) {
837         String s = String.valueOf(x);
838         synchronized (lock) {
839             print(s);
840             println();
841         }
842     }
843
844     /**
845      * A convenience method to write a formatted string to this writer using
846      * the specified format string and arguments.  If automatic flushing is
847      * enabled, calls to this method will flush the output buffer.
848      *
849      * <p> An invocation of this method of the form
850      * {@code out.printf(format, args)}
851      * behaves in exactly the same way as the invocation
852      *
853      * <pre>{@code
854      *     out.format(format, args)
855      * }</pre>
856      *
857      * @param  format
858      *         A format string as described in <a
859      *         href="../util/Formatter.html#syntax">Format string syntax</a>.
860      *
861      * @param  args
862      *         Arguments referenced by the format specifiers in the format
863      *         string.  If there are more arguments than format specifiers, the
864      *         extra arguments are ignored.  The number of arguments is
865      *         variable and may be zero.  The maximum number of arguments is
866      *         limited by the maximum dimension of a Java array as defined by
867      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
868      *         The behaviour on a
869      *         {@code null} argument depends on the <a
870      *         href="../util/Formatter.html#syntax">conversion</a>.
871      *
872      * @throws  java.util.IllegalFormatException
873      *          If a format string contains an illegal syntax, a format
874      *          specifier that is incompatible with the given arguments,
875      *          insufficient arguments given the format string, or other
876      *          illegal conditions.  For specification of all possible
877      *          formatting errors, see the <a
878      *          href="../util/Formatter.html#detail">Details</a> section of the
879      *          formatter class specification.
880      *
881      * @throws  NullPointerException
882      *          If the {@code format} is {@code null}
883      *
884      * @return  This writer
885      *
886      * @since  1.5
887      */

888     public PrintWriter printf(String format, Object ... args) {
889         return format(format, args);
890     }
891
892     /**
893      * A convenience method to write a formatted string to this writer using
894      * the specified format string and arguments.  If automatic flushing is
895      * enabled, calls to this method will flush the output buffer.
896      *
897      * <p> An invocation of this method of the form
898      * {@code out.printf(l, format, args)}
899      * behaves in exactly the same way as the invocation
900      *
901      * <pre>{@code
902      *     out.format(l, format, args)
903      * }</pre>
904      *
905      * @param  l
906      *         The {@linkplain java.util.Locale locale} to apply during
907      *         formatting.  If {@code l} is {@code null} then no localization
908      *         is applied.
909      *
910      * @param  format
911      *         A format string as described in <a
912      *         href="../util/Formatter.html#syntax">Format string syntax</a>.
913      *
914      * @param  args
915      *         Arguments referenced by the format specifiers in the format
916      *         string.  If there are more arguments than format specifiers, the
917      *         extra arguments are ignored.  The number of arguments is
918      *         variable and may be zero.  The maximum number of arguments is
919      *         limited by the maximum dimension of a Java array as defined by
920      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
921      *         The behaviour on a
922      *         {@code null} argument depends on the <a
923      *         href="../util/Formatter.html#syntax">conversion</a>.
924      *
925      * @throws  java.util.IllegalFormatException
926      *          If a format string contains an illegal syntax, a format
927      *          specifier that is incompatible with the given arguments,
928      *          insufficient arguments given the format string, or other
929      *          illegal conditions.  For specification of all possible
930      *          formatting errors, see the <a
931      *          href="../util/Formatter.html#detail">Details</a> section of the
932      *          formatter class specification.
933      *
934      * @throws  NullPointerException
935      *          If the {@code format} is {@code null}
936      *
937      * @return  This writer
938      *
939      * @since  1.5
940      */

941     public PrintWriter printf(Locale l, String format, Object ... args) {
942         return format(l, format, args);
943     }
944
945     /**
946      * Writes a formatted string to this writer using the specified format
947      * string and arguments.  If automatic flushing is enabled, calls to this
948      * method will flush the output buffer.
949      *
950      * <p> The locale always used is the one returned by {@link
951      * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any
952      * previous invocations of other formatting methods on this object.
953      *
954      * @param  format
955      *         A format string as described in <a
956      *         href="../util/Formatter.html#syntax">Format string syntax</a>.
957      *
958      * @param  args
959      *         Arguments referenced by the format specifiers in the format
960      *         string.  If there are more arguments than format specifiers, the
961      *         extra arguments are ignored.  The number of arguments is
962      *         variable and may be zero.  The maximum number of arguments is
963      *         limited by the maximum dimension of a Java array as defined by
964      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
965      *         The behaviour on a
966      *         {@code null} argument depends on the <a
967      *         href="../util/Formatter.html#syntax">conversion</a>.
968      *
969      * @throws  java.util.IllegalFormatException
970      *          If a format string contains an illegal syntax, a format
971      *          specifier that is incompatible with the given arguments,
972      *          insufficient arguments given the format string, or other
973      *          illegal conditions.  For specification of all possible
974      *          formatting errors, see the <a
975      *          href="../util/Formatter.html#detail">Details</a> section of the
976      *          Formatter class specification.
977      *
978      * @throws  NullPointerException
979      *          If the {@code format} is {@code null}
980      *
981      * @return  This writer
982      *
983      * @since  1.5
984      */

985     public PrintWriter format(String format, Object ... args) {
986         try {
987             synchronized (lock) {
988                 ensureOpen();
989                 if ((formatter == null)
990                     || (formatter.locale() != Locale.getDefault()))
991                     formatter = new Formatter(this);
992                 formatter.format(Locale.getDefault(), format, args);
993                 if (autoFlush)
994                     out.flush();
995             }
996         } catch (InterruptedIOException x) {
997             Thread.currentThread().interrupt();
998         } catch (IOException x) {
999             trouble = true;
1000         }
1001         return this;
1002     }
1003
1004     /**
1005      * Writes a formatted string to this writer using the specified format
1006      * string and arguments.  If automatic flushing is enabled, calls to this
1007      * method will flush the output buffer.
1008      *
1009      * @param  l
1010      *         The {@linkplain java.util.Locale locale} to apply during
1011      *         formatting.  If {@code l} is {@code null} then no localization
1012      *         is applied.
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 writer
1042      *
1043      * @since  1.5
1044      */

1045     public PrintWriter format(Locale l, String format, Object ... args) {
1046         try {
1047             synchronized (lock) {
1048                 ensureOpen();
1049                 if ((formatter == null) || (formatter.locale() != l))
1050                     formatter = new Formatter(this, l);
1051                 formatter.format(l, format, args);
1052                 if (autoFlush)
1053                     out.flush();
1054             }
1055         } catch (InterruptedIOException x) {
1056             Thread.currentThread().interrupt();
1057         } catch (IOException x) {
1058             trouble = true;
1059         }
1060         return this;
1061     }
1062
1063     /**
1064      * Appends the specified character sequence to this writer.
1065      *
1066      * <p> An invocation of this method of the form {@code out.append(csq)}
1067      * behaves in exactly the same way as the invocation
1068      *
1069      * <pre>{@code
1070      *     out.write(csq.toString())
1071      * }</pre>
1072      *
1073      * <p> Depending on the specification of {@code toString} for the
1074      * character sequence {@code csq}, the entire sequence may not be
1075      * appended. For instance, invoking the {@code toString} method of a
1076      * character buffer will return a subsequence whose content depends upon
1077      * the buffer's position and limit.
1078      *
1079      * @param  csq
1080      *         The character sequence to append.  If {@code csq} is
1081      *         {@code null}, then the four characters {@code "null"} are
1082      *         appended to this writer.
1083      *
1084      * @return  This writer
1085      *
1086      * @since  1.5
1087      */

1088     public PrintWriter append(CharSequence csq) {
1089         write(String.valueOf(csq));
1090         return this;
1091     }
1092
1093     /**
1094      * Appends a subsequence of the specified character sequence to this writer.
1095      *
1096      * <p> An invocation of this method of the form
1097      * {@code out.append(csq, start, end)}
1098      * when {@code csq} is not {@code null}, behaves in
1099      * exactly the same way as the invocation
1100      *
1101      * <pre>{@code
1102      *     out.write(csq.subSequence(start, end).toString())
1103      * }</pre>
1104      *
1105      * @param  csq
1106      *         The character sequence from which a subsequence will be
1107      *         appended.  If {@code csq} is {@code null}, then characters
1108      *         will be appended as if {@code csq} contained the four
1109      *         characters {@code "null"}.
1110      *
1111      * @param  start
1112      *         The index of the first character in the subsequence
1113      *
1114      * @param  end
1115      *         The index of the character following the last character in the
1116      *         subsequence
1117      *
1118      * @return  This writer
1119      *
1120      * @throws  IndexOutOfBoundsException
1121      *          If {@code start} or {@code end} are negative, {@code start}
1122      *          is greater than {@code end}, or {@code end} is greater than
1123      *          {@code csq.length()}
1124      *
1125      * @since  1.5
1126      */

1127     public PrintWriter append(CharSequence csq, int start, int end) {
1128         if (csq == null) csq = "null";
1129         return append(csq.subSequence(start, end));
1130     }
1131
1132     /**
1133      * Appends the specified character to this writer.
1134      *
1135      * <p> An invocation of this method of the form {@code out.append(c)}
1136      * behaves in exactly the same way as the invocation
1137      *
1138      * <pre>{@code
1139      *     out.write(c)
1140      * }</pre>
1141      *
1142      * @param  c
1143      *         The 16-bit character to append
1144      *
1145      * @return  This writer
1146      *
1147      * @since 1.5
1148      */

1149     public PrintWriter append(char c) {
1150         write(c);
1151         return this;
1152     }
1153 }
1154