151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.io;
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Formatter;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Locale;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.charset.Charset;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.charset.IllegalCharsetNameException;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.charset.UnsupportedCharsetException;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A <code>PrintStream</code> adds functionality to another output stream,
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * namely the ability to print representations of various data values
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * conveniently.  Two other features are provided as well.  Unlike other output
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * streams, a <code>PrintStream</code> never throws an
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>IOException</code>; instead, exceptional situations merely set an
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * internal flag that can be tested via the <code>checkError</code> method.
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Optionally, a <code>PrintStream</code> can be created so as to flush
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * automatically; this means that the <code>flush</code> method is
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * automatically invoked after a byte array is written, one of the
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>println</code> methods is invoked, or a newline character or byte
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (<code>'\n'</code>) is written.
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> All characters printed by a <code>PrintStream</code> are converted into
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * bytes using the platform's default character encoding.  The <code>{@link
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * PrintWriter}</code> class should be used in situations that require writing
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * characters rather than bytes.
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author     Frank Yellin
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author     Mark Reinhold
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since      JDK1.0
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class PrintStream extends FilterOutputStream
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    implements Appendable, Closeable
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final boolean autoFlush;
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private boolean trouble = false;
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Formatter formatter;
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Track both the text- and character-output streams, so that their buffers
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * can be flushed without flushing the entire stream.
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private BufferedWriter textOut;
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private OutputStreamWriter charOut;
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
73de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski    private Charset charset;
74de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * requireNonNull is explicitly declared here so as not to create an extra
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * dependency on java.util.Objects.requireNonNull. PrintStream is loaded
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * early during system initialization.
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static <T> T requireNonNull(T obj, String message) {
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (obj == null)
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException(message);
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return obj;
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a charset object for the given charset name.
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          is csn is null
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedEncodingException  if the charset is not supported
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static Charset toCharset(String csn)
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws UnsupportedEncodingException
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        requireNonNull(csn, "charsetName");
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return Charset.forName(csn);
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // UnsupportedEncodingException should be thrown
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new UnsupportedEncodingException(csn);
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* Private constructors */
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private PrintStream(boolean autoFlush, OutputStream out) {
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        super(out);
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.autoFlush = autoFlush;
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        super(out);
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.autoFlush = autoFlush;
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* Variant of the private constructor so that the given charset name
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * can be verified before evaluating the OutputStream argument. Used
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by constructors creating a FileOutputStream that also take a
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * charset name.
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private PrintStream(boolean autoFlush, Charset charset, OutputStream out)
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws UnsupportedEncodingException
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(autoFlush, out, charset);
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream.  This stream will not flush automatically.
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  out        The output stream to which values and objects will be
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    printed
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream)
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(OutputStream out) {
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(out, false);
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream.
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  out        The output stream to which values and objects will be
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    printed
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  autoFlush  A boolean; if true, the output buffer will be flushed
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    whenever a byte array is written, one of the
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    <code>println</code> methods is invoked, or a newline
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    character or byte (<code>'\n'</code>) is written
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean)
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(OutputStream out, boolean autoFlush) {
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(autoFlush, requireNonNull(out, "Null output stream"));
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream.
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  out        The output stream to which values and objects will be
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    printed
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  autoFlush  A boolean; if true, the output buffer will be flushed
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    whenever a byte array is written, one of the
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    <code>println</code> methods is invoked, or a newline
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    character or byte (<code>'\n'</code>) is written
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  encoding   The name of a supported
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    <a href="../lang/package-summary.html#charenc">
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                    character encoding</a>
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  UnsupportedEncodingException
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the named encoding is not supported
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.4
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(OutputStream out, boolean autoFlush, String encoding)
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws UnsupportedEncodingException
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(autoFlush,
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski             requireNonNull(out, "Null output stream"),
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski             toCharset(encoding));
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream, without automatic line flushing, with the
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified file name.  This convenience constructor creates
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the necessary intermediate {@link java.io.OutputStreamWriter
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OutputStreamWriter}, which will encode characters using the
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for this instance of the Java virtual machine.
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  fileName
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The name of the file to use as the destination of this print
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         stream.  If the file exists, then it will be truncated to
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         zero size; otherwise, a new file will be created.  The output
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         will be written to the file and is buffered.
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  FileNotFoundException
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the given file object does not denote an existing, writable
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          regular file and a new regular file of that name cannot be
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          created, or if some other error occurs while opening or
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          creating the file
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  SecurityException
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a security manager is present and {@link
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          SecurityManager#checkWrite checkWrite(fileName)} denies write
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          access to the file
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(String fileName) throws FileNotFoundException {
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(false, new FileOutputStream(fileName));
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream, without automatic line flushing, with the
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified file name and charset.  This convenience constructor creates
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the necessary intermediate {@link java.io.OutputStreamWriter
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OutputStreamWriter}, which will encode characters using the provided
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * charset.
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  fileName
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The name of the file to use as the destination of this print
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         stream.  If the file exists, then it will be truncated to
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         zero size; otherwise, a new file will be created.  The output
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         will be written to the file and is buffered.
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  csn
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The name of a supported {@linkplain java.nio.charset.Charset
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         charset}
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  FileNotFoundException
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the given file object does not denote an existing, writable
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          regular file and a new regular file of that name cannot be
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          created, or if some other error occurs while opening or
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          creating the file
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  SecurityException
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a security manager is present and {@link
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          SecurityManager#checkWrite checkWrite(fileName)} denies write
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          access to the file
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  UnsupportedEncodingException
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the named charset is not supported
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(String fileName, String csn)
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws FileNotFoundException, UnsupportedEncodingException
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // ensure charset is checked before the file is opened
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(false, toCharset(csn), new FileOutputStream(fileName));
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream, without automatic line flushing, with the
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified file.  This convenience constructor creates the necessary
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * which will encode characters using the {@linkplain
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.nio.charset.Charset#defaultCharset() default charset} for this
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * instance of the Java virtual machine.
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  file
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The file to use as the destination of this print stream.  If the
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         file exists, then it will be truncated to zero size; otherwise,
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         a new file will be created.  The output will be written to the
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         file and is buffered.
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  FileNotFoundException
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the given file object does not denote an existing, writable
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          regular file and a new regular file of that name cannot be
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          created, or if some other error occurs while opening or
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          creating the file
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  SecurityException
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a security manager is present and {@link
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          SecurityManager#checkWrite checkWrite(file.getPath())}
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          denies write access to the file
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(File file) throws FileNotFoundException {
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(false, new FileOutputStream(file));
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new print stream, without automatic line flushing, with the
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified file and charset.  This convenience constructor creates
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the necessary intermediate {@link java.io.OutputStreamWriter
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OutputStreamWriter}, which will encode characters using the provided
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * charset.
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  file
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The file to use as the destination of this print stream.  If the
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         file exists, then it will be truncated to zero size; otherwise,
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         a new file will be created.  The output will be written to the
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         file and is buffered.
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  csn
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The name of a supported {@linkplain java.nio.charset.Charset
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         charset}
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  FileNotFoundException
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the given file object does not denote an existing, writable
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          regular file and a new regular file of that name cannot be
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          created, or if some other error occurs while opening or
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          creating the file
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  SecurityException
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a security manager is presentand {@link
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          SecurityManager#checkWrite checkWrite(file.getPath())}
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          denies write access to the file
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  UnsupportedEncodingException
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the named charset is not supported
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream(File file, String csn)
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws FileNotFoundException, UnsupportedEncodingException
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // ensure charset is checked before the file is opened
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(false, toCharset(csn), new FileOutputStream(file));
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /** Check to make sure that the stream has not been closed */
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void ensureOpen() throws IOException {
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (out == null)
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IOException("Stream closed");
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Flushes the stream.  This is done by writing any buffered output bytes to
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the underlying output stream and then flushing that stream.
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.io.OutputStream#flush()
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void flush() {
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                out.flush();
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            catch (IOException x) {
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                trouble = true;
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private boolean closing = false; /* To avoid recursive closing */
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
347de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski    // Android-changed: Lazily initialize textOut.
348de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski    private BufferedWriter getTextOut() {
349de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski        if (textOut == null) {
350de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski            charOut = charset != null ? new OutputStreamWriter(this, charset) :
351de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                    new OutputStreamWriter(this);
352de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski            textOut = new BufferedWriter(charOut);
353de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski        }
354de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski        return textOut;
355de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski    }
356de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Closes the stream.  This is done by flushing the stream and then closing
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the underlying output stream.
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.io.OutputStream#close()
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void close() {
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (! closing) {
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                closing = true;
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try {
368de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                    // Android-changed: Lazily initialized.
369de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                    if (textOut != null) {
370de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                        textOut.close();
371de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                    }
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    out.close();
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                catch (IOException x) {
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    trouble = true;
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut = null;
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                charOut = null;
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                out = null;
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Flushes the stream and checks its error state. The internal error state
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is set to <code>true</code> when the underlying output stream throws an
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>IOException</code> other than <code>InterruptedIOException</code>,
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and when the <code>setError</code> method is invoked.  If an operation
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * on the underlying output stream throws an
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>InterruptedIOException</code>, then the <code>PrintStream</code>
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * converts the exception back into an interrupt by doing:
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre>
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     Thread.currentThread().interrupt();
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </pre>
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * or the equivalent.
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if and only if this stream has encountered an
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <code>IOException</code> other than
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <code>InterruptedIOException</code>, or the
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <code>setError</code> method has been invoked
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean checkError() {
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (out != null)
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            flush();
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (out instanceof java.io.PrintStream) {
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            PrintStream ps = (PrintStream) out;
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return ps.checkError();
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return trouble;
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the error state of the stream to <code>true</code>.
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method will cause subsequent invocations of {@link
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #checkError()} to return <tt>true</tt> until {@link
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #clearError()} is invoked.
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since JDK1.1
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected void setError() {
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        trouble = true;
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Clears the internal error state of this stream.
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method will cause subsequent invocations of {@link
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #checkError()} to return <tt>false</tt> until another write
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operation fails and invokes {@link #setError()}.
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected void clearError() {
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        trouble = false;
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Exception-catching, synchronized output operations,
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * which also implement the write() methods of OutputStream
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes the specified byte to this stream.  If the byte is a newline and
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * automatic flushing is enabled then the <code>flush</code> method will be
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * invoked.
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Note that the byte is written as given; to write a character that
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * will be translated according to the platform's default character
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encoding, use the <code>print(char)</code> or <code>println(char)</code>
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * methods.
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  b  The byte to be written
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #print(char)
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #println(char)
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void write(int b) {
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                out.write(b);
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if ((b == '\n') && autoFlush)
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    out.flush();
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (InterruptedIOException x) {
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (IOException x) {
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes <code>len</code> bytes from the specified byte array starting at
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * offset <code>off</code> to this stream.  If automatic flushing is
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * enabled then the <code>flush</code> method will be invoked.
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Note that the bytes will be written as given; to write characters
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that will be translated according to the platform's default character
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encoding, use the <code>print(char)</code> or <code>println(char)</code>
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * methods.
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  buf   A byte array
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  off   Offset from which to start taking bytes
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  len   Number of bytes to write
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void write(byte buf[], int off, int len) {
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                out.write(buf, off, len);
49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (autoFlush)
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    out.flush();
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (InterruptedIOException x) {
49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (IOException x) {
50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The following private methods on the text- and character-output streams
50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * always flush the stream buffers, so that writes to the underlying byte
50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stream occur as promptly as with the original PrintStream.
50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void write(char buf[]) {
51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
515de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                // Android-changed: Lazily initialized.
516de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                BufferedWriter textOut = getTextOut();
51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut.write(buf);
51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut.flushBuffer();
51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                charOut.flushBuffer();
52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (autoFlush) {
52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    for (int i = 0; i < buf.length; i++)
52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (buf[i] == '\n')
52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            out.flush();
52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (InterruptedIOException x) {
52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (IOException x) {
53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void write(String s) {
53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
539de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                // Android-changed: Lazily initialized.
540de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                BufferedWriter textOut = getTextOut();
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut.write(s);
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut.flushBuffer();
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                charOut.flushBuffer();
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (autoFlush && (s.indexOf('\n') >= 0))
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    out.flush();
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (InterruptedIOException x) {
54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (IOException x) {
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void newLine() {
55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
560de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                // Android-changed: Lazily initialized.
561de626ec8a109ea18283d96c720cc57e2f32f67faPiotr Jastrzebski                BufferedWriter textOut = getTextOut();
56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut.newLine();
56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                textOut.flushBuffer();
56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                charOut.flushBuffer();
56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (autoFlush)
56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    out.flush();
56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (InterruptedIOException x) {
57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (IOException x) {
57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* Methods that do not terminate lines */
57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a boolean value.  The string produced by <code>{@link
58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.lang.String#valueOf(boolean)}</code> is translated into bytes
58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      b   The <code>boolean</code> to be printed
58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(boolean b) {
58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(b ? "true" : "false");
59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a character.  The character is translated into one or more bytes
59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      c   The <code>char</code> to be printed
59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(char c) {
60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(String.valueOf(c));
60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints an integer.  The string produced by <code>{@link
60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.lang.String#valueOf(int)}</code> is translated into bytes
60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      i   The <code>int</code> to be printed
61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.lang.Integer#toString(int)
61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(int i) {
61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(String.valueOf(i));
61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a long integer.  The string produced by <code>{@link
62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.lang.String#valueOf(long)}</code> is translated into bytes
62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
62251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
62351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
62451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
62551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      l   The <code>long</code> to be printed
62651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.lang.Long#toString(long)
62751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(long l) {
62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(String.valueOf(l));
63051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
63151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
63251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
63351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a floating-point number.  The string produced by <code>{@link
63451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.lang.String#valueOf(float)}</code> is translated into bytes
63551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
63951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      f   The <code>float</code> to be printed
64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.lang.Float#toString(float)
64151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
64251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(float f) {
64351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(String.valueOf(f));
64451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
64551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
64651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a double-precision floating-point number.  The string produced by
64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * bytes according to the platform's default character encoding, and these
65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * bytes are written in exactly the manner of the <code>{@link
65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #write(int)}</code> method.
65251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      d   The <code>double</code> to be printed
65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.lang.Double#toString(double)
65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(double d) {
65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(String.valueOf(d));
65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
66051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints an array of characters.  The characters are converted into bytes
66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      s   The array of chars to be printed
66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
66851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  NullPointerException  If <code>s</code> is <code>null</code>
66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(char s[]) {
67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(s);
67251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
67351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
67451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
67551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a string.  If the argument is <code>null</code> then the string
67651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>"null"</code> is printed.  Otherwise, the string's characters are
67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * converted into bytes according to the platform's default character
67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encoding, and these bytes are written in exactly the manner of the
67951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
68051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
68151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      s   The <code>String</code> to be printed
68251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
68351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(String s) {
68451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (s == null) {
68551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            s = "null";
68651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
68751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(s);
68851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
68951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
69051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
69151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints an object.  The string produced by the <code>{@link
69251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.lang.String#valueOf(Object)}</code> method is translated into bytes
69351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * according to the platform's default character encoding, and these bytes
69451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are written in exactly the manner of the
69551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #write(int)}</code> method.
69651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
69751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      obj   The <code>Object</code> to be printed
69851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.lang.Object#toString()
69951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
70051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void print(Object obj) {
70151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(String.valueOf(obj));
70251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
70351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
70451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
70551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* Methods that do terminate lines */
70651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
70751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
70851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Terminates the current line by writing the line separator string.  The
70951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * line separator string is defined by the system property
71051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>line.separator</code>, and is not necessarily a single newline
71151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * character (<code>'\n'</code>).
71251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
71351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println() {
71451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        newLine();
71551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
71651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
71751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
71851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a boolean and then terminate the line.  This method behaves as
71951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(boolean)}</code> and then
72051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
72151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
72251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>boolean</code> to be printed
72351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
72451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(boolean x) {
72551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
72651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
72751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
72851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
72951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
73051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
73151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
73251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a character and then terminate the line.  This method behaves as
73351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(char)}</code> and then
73451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
73551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
73651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>char</code> to be printed.
73751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
73851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(char x) {
73951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
74051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
74151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
74251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
74351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
74451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
74551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
74651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints an integer and then terminate the line.  This method behaves as
74751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(int)}</code> and then
74851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
74951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
75051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>int</code> to be printed.
75151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
75251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(int x) {
75351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
75451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
75551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
75651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
75751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
75851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
75951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
76051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a long and then terminate the line.  This method behaves as
76151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(long)}</code> and then
76251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
76351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
76451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  a The <code>long</code> to be printed.
76551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
76651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(long x) {
76751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
76851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
76951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
77051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
77151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
77251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
77351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
77451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a float and then terminate the line.  This method behaves as
77551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(float)}</code> and then
77651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
77751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
77851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>float</code> to be printed.
77951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
78051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(float x) {
78151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
78251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
78351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
78451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
78551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
78651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
78751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
78851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a double and then terminate the line.  This method behaves as
78951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(double)}</code> and then
79051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
79151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
79251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>double</code> to be printed.
79351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
79451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(double x) {
79551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
79651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
79751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
79851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
79951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
80051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
80151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
80251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints an array of characters and then terminate the line.  This method
80351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * behaves as though it invokes <code>{@link #print(char[])}</code> and
80451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * then <code>{@link #println()}</code>.
80551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
80651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  an array of chars to print.
80751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
80851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(char x[]) {
80951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
81051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
81151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
81251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
81351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
81451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
81551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
81651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a String and then terminate the line.  This method behaves as
81751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(String)}</code> and then
81851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
81951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
82051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>String</code> to be printed.
82151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
82251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(String x) {
82351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
82451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(x);
82551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
82651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
82751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
82851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
82951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
83051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints an Object and then terminate the line.  This method calls
83151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * at first String.valueOf(x) to get the printed object's string value,
83251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * then behaves as
83351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * though it invokes <code>{@link #print(String)}</code> and then
83451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>{@link #println()}</code>.
83551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
83651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param x  The <code>Object</code> to be printed.
83751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
83851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void println(Object x) {
83951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String s = String.valueOf(x);
84051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (this) {
84151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(s);
84251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newLine();
84351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
84451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
84551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
84651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
84751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
84851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A convenience method to write a formatted string to this output stream
84951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * using the specified format string and arguments.
85051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
85151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> An invocation of this method of the form <tt>out.printf(format,
85251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * args)</tt> behaves in exactly the same way as the invocation
85351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
85451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre>
85551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     out.format(format, args) </pre>
85651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
85751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  format
85851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         A format string as described in <a
85951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">Format string syntax</a>
86051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
86151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  args
86251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         Arguments referenced by the format specifiers in the format
86351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         string.  If there are more arguments than format specifiers, the
86451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         extra arguments are ignored.  The number of arguments is
86551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         variable and may be zero.  The maximum number of arguments is
86651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         limited by the maximum dimension of a Java array as defined by
86751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
86851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The behaviour on a
86951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <tt>null</tt> argument depends on the <a
87051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">conversion</a>.
87151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
87251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalFormatException
87351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a format string contains an illegal syntax, a format
87451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          specifier that is incompatible with the given arguments,
87551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          insufficient arguments given the format string, or other
87651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          illegal conditions.  For specification of all possible
87751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatting errors, see the <a
87851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          href="../util/Formatter.html#detail">Details</a> section of the
87951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatter class specification.
88051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
88151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  NullPointerException
88251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the <tt>format</tt> is <tt>null</tt>
88351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
88451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
88551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
88651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
88751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
88851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream printf(String format, Object ... args) {
88951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return format(format, args);
89051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
89151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
89251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
89351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A convenience method to write a formatted string to this output stream
89451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * using the specified format string and arguments.
89551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
89651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> An invocation of this method of the form <tt>out.printf(l, format,
89751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * args)</tt> behaves in exactly the same way as the invocation
89851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
89951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre>
90051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     out.format(l, format, args) </pre>
90151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
90251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  l
90351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The {@linkplain java.util.Locale locale} to apply during
90451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
90551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         is applied.
90651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
90751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  format
90851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         A format string as described in <a
90951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">Format string syntax</a>
91051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
91151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  args
91251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         Arguments referenced by the format specifiers in the format
91351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         string.  If there are more arguments than format specifiers, the
91451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         extra arguments are ignored.  The number of arguments is
91551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         variable and may be zero.  The maximum number of arguments is
91651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         limited by the maximum dimension of a Java array as defined by
91751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
91851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The behaviour on a
91951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <tt>null</tt> argument depends on the <a
92051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">conversion</a>.
92151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
92251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalFormatException
92351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a format string contains an illegal syntax, a format
92451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          specifier that is incompatible with the given arguments,
92551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          insufficient arguments given the format string, or other
92651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          illegal conditions.  For specification of all possible
92751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatting errors, see the <a
92851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          href="../util/Formatter.html#detail">Details</a> section of the
92951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatter class specification.
93051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
93151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  NullPointerException
93251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the <tt>format</tt> is <tt>null</tt>
93351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
93451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
93551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
93651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
93751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
93851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream printf(Locale l, String format, Object ... args) {
93951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return format(l, format, args);
94051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
94151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
94251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
94351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes a formatted string to this output stream using the specified
94451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * format string and arguments.
94551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
94651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> The locale always used is the one returned by {@link
94751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any
94851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * previous invocations of other formatting methods on this object.
94951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
95051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  format
95151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         A format string as described in <a
95251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">Format string syntax</a>
95351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
95451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  args
95551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         Arguments referenced by the format specifiers in the format
95651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         string.  If there are more arguments than format specifiers, the
95751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         extra arguments are ignored.  The number of arguments is
95851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         variable and may be zero.  The maximum number of arguments is
95951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         limited by the maximum dimension of a Java array as defined by
96051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
96151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The behaviour on a
96251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <tt>null</tt> argument depends on the <a
96351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">conversion</a>.
96451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
96551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalFormatException
96651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a format string contains an illegal syntax, a format
96751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          specifier that is incompatible with the given arguments,
96851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          insufficient arguments given the format string, or other
96951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          illegal conditions.  For specification of all possible
97051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatting errors, see the <a
97151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          href="../util/Formatter.html#detail">Details</a> section of the
97251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatter class specification.
97351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
97451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  NullPointerException
97551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the <tt>format</tt> is <tt>null</tt>
97651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
97751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
97851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
97951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
98051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
98151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream format(String format, Object ... args) {
98251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
98351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
98451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
98551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if ((formatter == null)
98651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    || (formatter.locale() != Locale.getDefault()))
98751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    formatter = new Formatter((Appendable) this);
98851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                formatter.format(Locale.getDefault(), format, args);
98951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
99051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (InterruptedIOException x) {
99151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
99251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException x) {
99351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
99451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
99551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this;
99651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
99751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
99851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
99951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes a formatted string to this output stream using the specified
100051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * format string and arguments.
100151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
100251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  l
100351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The {@linkplain java.util.Locale locale} to apply during
100451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
100551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         is applied.
100651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
100751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  format
100851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         A format string as described in <a
100951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">Format string syntax</a>
101051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
101151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  args
101251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         Arguments referenced by the format specifiers in the format
101351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         string.  If there are more arguments than format specifiers, the
101451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         extra arguments are ignored.  The number of arguments is
101551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         variable and may be zero.  The maximum number of arguments is
101651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         limited by the maximum dimension of a Java array as defined by
101751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
101851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The behaviour on a
101951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <tt>null</tt> argument depends on the <a
102051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         href="../util/Formatter.html#syntax">conversion</a>.
102151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
102251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalFormatException
102351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If a format string contains an illegal syntax, a format
102451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          specifier that is incompatible with the given arguments,
102551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          insufficient arguments given the format string, or other
102651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          illegal conditions.  For specification of all possible
102751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatting errors, see the <a
102851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          href="../util/Formatter.html#detail">Details</a> section of the
102951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          formatter class specification.
103051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
103151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  NullPointerException
103251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the <tt>format</tt> is <tt>null</tt>
103351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
103451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
103551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
103651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
103751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
103851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream format(Locale l, String format, Object ... args) {
103951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
104051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (this) {
104151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ensureOpen();
104251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if ((formatter == null)
104351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    || (formatter.locale() != l))
104451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    formatter = new Formatter(this, l);
104551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                formatter.format(l, format, args);
104651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
104751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (InterruptedIOException x) {
104851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Thread.currentThread().interrupt();
104951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException x) {
105051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            trouble = true;
105151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
105251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this;
105351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
105451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
105551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
105651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Appends the specified character sequence to this output stream.
105751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
105851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> An invocation of this method of the form <tt>out.append(csq)</tt>
105951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * behaves in exactly the same way as the invocation
106051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
106151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre>
106251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     out.print(csq.toString()) </pre>
106351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
106451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Depending on the specification of <tt>toString</tt> for the
106551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * character sequence <tt>csq</tt>, the entire sequence may not be
106651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * appended.  For instance, invoking then <tt>toString</tt> method of a
106751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * character buffer will return a subsequence whose content depends upon
106851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the buffer's position and limit.
106951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
107051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  csq
107151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The character sequence to append.  If <tt>csq</tt> is
107251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <tt>null</tt>, then the four characters <tt>"null"</tt> are
107351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         appended to this output stream.
107451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
107551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
107651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
107751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
107851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
107951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream append(CharSequence csq) {
108051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (csq == null)
108151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print("null");
108251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        else
108351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            print(csq.toString());
108451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this;
108551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
108651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
108751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
108851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Appends a subsequence of the specified character sequence to this output
108951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stream.
109051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
109151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> An invocation of this method of the form <tt>out.append(csq, start,
109251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * end)</tt> when <tt>csq</tt> is not <tt>null</tt>, behaves in
109351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * exactly the same way as the invocation
109451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
109551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre>
109651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     out.print(csq.subSequence(start, end).toString()) </pre>
109751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
109851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  csq
109951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The character sequence from which a subsequence will be
110051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         appended.  If <tt>csq</tt> is <tt>null</tt>, then characters
110151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         will be appended as if <tt>csq</tt> contained the four
110251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         characters <tt>"null"</tt>.
110351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
110451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  start
110551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The index of the first character in the subsequence
110651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
110751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  end
110851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The index of the character following the last character in the
110951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         subsequence
111051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
111151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
111251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
111351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IndexOutOfBoundsException
111451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt>
111551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          is greater than <tt>end</tt>, or <tt>end</tt> is greater than
111651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          <tt>csq.length()</tt>
111751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
111851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
111951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
112051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream append(CharSequence csq, int start, int end) {
112151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CharSequence cs = (csq == null ? "null" : csq);
112251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(cs.subSequence(start, end).toString());
112351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this;
112451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
112551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
112651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
112751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Appends the specified character to this output stream.
112851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
112951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> An invocation of this method of the form <tt>out.append(c)</tt>
113051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * behaves in exactly the same way as the invocation
113151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
113251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre>
113351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     out.print(c) </pre>
113451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
113551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  c
113651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         The 16-bit character to append
113751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
113851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This output stream
113951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
114051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  1.5
114151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
114251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public PrintStream append(char c) {
114351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        print(c);
114451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this;
114551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
114651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
114751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
1148