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