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