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