1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.charset.Charset;
21f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport java.nio.charset.IllegalCharsetNameException;
22b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughesimport java.util.Arrays;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Formatter;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.IllegalFormatException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Wraps an existing {@link OutputStream} and provides convenience methods for
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * writing common data types in a human readable format. This is not to be
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * confused with DataOutputStream which is used for encoding common data types
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * so that they can be read back in. No {@code IOException} is thrown by this
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class. Instead, callers should use {@link #checkError()} to see if a problem
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has occurred in this stream.
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
35b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughespublic class PrintStream extends FilterOutputStream implements Appendable, Closeable {
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates whether or not this PrintStream has incurred an error.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean ioError;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates whether or not this PrintStream should flush its contents after
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * printing a new line.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
45b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    private boolean autoFlush;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String encoding;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with {@code out} as its target
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stream. By default, the new print stream does not automatically flush its
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contents to the target stream when a newline is encountered.
53f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param out
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target output stream.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code out} is {@code null}.
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream(OutputStream out) {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(out);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (out == null) {
62d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("out == null");
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with {@code out} as its target
68b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * stream. The parameter {@code autoFlush} determines if the print stream
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * automatically flushes its contents to the target stream when a newline is
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * encountered.
71f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param out
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target output stream.
74b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * @param autoFlush
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            indicates whether to flush contents upon encountering a
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            newline sequence.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code out} is {@code null}.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
80b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public PrintStream(OutputStream out, boolean autoFlush) {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(out);
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (out == null) {
83d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("out == null");
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
85b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        this.autoFlush = autoFlush;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with {@code out} as its target
909b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     * stream and using the character encoding {@code charsetName} while writing. The
91b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * parameter {@code autoFlush} determines if the print stream automatically
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * flushes its contents to the target stream when a newline is encountered.
93f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param out
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target output stream.
96b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * @param autoFlush
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            indicates whether or not to flush contents upon encountering a
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            newline sequence.
999b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     * @param charsetName
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-null string describing the desired character encoding.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
1029b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     *             if {@code out} or {@code charsetName} are {@code null}.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedEncodingException
1049b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     *             if the encoding specified by {@code charsetName} is not supported.
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1069b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes    public PrintStream(OutputStream out, boolean autoFlush, String charsetName)
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws UnsupportedEncodingException {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(out);
109d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root        if (out == null) {
110d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("out == null");
1119b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes        } else if (charsetName == null) {
1129b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes            throw new NullPointerException("charsetName == null");
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
114b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        this.autoFlush = autoFlush;
115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        try {
1169b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes            if (!Charset.isSupported(charsetName)) {
1179b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes                throw new UnsupportedEncodingException(charsetName);
118f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
119f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } catch (IllegalCharsetNameException e) {
1209b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes            throw new UnsupportedEncodingException(charsetName);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1229b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes        encoding = charsetName;
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with {@code file} as its target. The
12799e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * VM's default character set is used for character encoding.
128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param file
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target file. If the file already exists, its contents are
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            removed, otherwise a new file is created.
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws FileNotFoundException
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while opening or creating the target file.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream(File file) throws FileNotFoundException {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(new FileOutputStream(file));
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with {@code file} as its target. The
1419b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     * character set named {@code charsetName} is used for character encoding.
142f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param file
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target file. If the file already exists, its contents are
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            removed, otherwise a new file is created.
1469b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     * @param charsetName
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the character set used for character encoding.
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws FileNotFoundException
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while opening or creating the target file.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
1519b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     *             if {@code charsetName} is {@code null}.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedEncodingException
1539b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     *             if the encoding specified by {@code charsetName} is not supported.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1559b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes    public PrintStream(File file, String charsetName) throws FileNotFoundException,
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            UnsupportedEncodingException {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(new FileOutputStream(file));
1589b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes        if (charsetName == null) {
1599b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes            throw new NullPointerException("charsetName == null");
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1619b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes        if (!Charset.isSupported(charsetName)) {
1629b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes            throw new UnsupportedEncodingException(charsetName);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1649b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes        encoding = charsetName;
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with the file identified by
16999e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * {@code fileName} as its target. The VM's default character
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * set is used for character encoding.
171f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fileName
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target file's name. If the file already exists, its
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            contents are removed, otherwise a new file is created.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws FileNotFoundException
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while opening or creating the target file.
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream(String fileName) throws FileNotFoundException {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(new File(fileName));
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PrintStream} with the file identified by
1849b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     * {@code fileName} as its target. The character set named {@code charsetName} is
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used for character encoding.
186f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fileName
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target file's name. If the file already exists, its
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            contents are removed, otherwise a new file is created.
1909b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     * @param charsetName
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the character set used for character encoding.
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws FileNotFoundException
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while opening or creating the target file.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
1959b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     *             if {@code charsetName} is {@code null}.
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedEncodingException
1979b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes     *             if the encoding specified by {@code charsetName} is not supported.
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1999b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes    public PrintStream(String fileName, String charsetName)
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws FileNotFoundException, UnsupportedEncodingException {
2019b9e9145bc55a47be42a9d3f7ecc9f6b533739b2Elliott Hughes        this(new File(fileName), charsetName);
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Flushes this stream and returns the value of the error flag.
206f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if either an {@code IOException} has been thrown
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         previously or if {@code setError()} has been called;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @see #setError()
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean checkError() {
21355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        OutputStream delegate = out;
21455392539fea537abfb6581b474918f9d611fba27Jesse Wilson        if (delegate == null) {
21555392539fea537abfb6581b474918f9d611fba27Jesse Wilson            return ioError;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
21755392539fea537abfb6581b474918f9d611fba27Jesse Wilson
21855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        flush();
21955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        return ioError || delegate.checkError();
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
223e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes     * Sets the error state of the stream to false.
224e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes     * @since 1.6
225e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes     */
226e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes    protected void clearError() {
227e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes        ioError = false;
228e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes    }
229e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes
230e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this print stream. Flushes this stream and then closes the target
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stream. If an I/O error occurs, this stream's error state is set to
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code true}.
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void close() {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        flush();
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (out != null) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.close();
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out = null;
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                setError();
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Ensures that all pending data is sent out to the target stream. It also
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * flushes the target stream. If an I/O error occurs, this stream's error
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * state is set to {@code true}.
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void flush() {
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (out != null) {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.flush();
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Ignored, fall through to setError
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setError();
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2673106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * Formats {@code args} according to the format string {@code format}, and writes the result
2683106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * to this stream. This method uses the user's default locale.
2693106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
270f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2713106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * @param format the format string (see {@link java.util.Formatter#format})
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param args
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the list of arguments passed to the formatter. If there are
2743106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     *            more arguments than required by {@code format},
2753106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     *            additional arguments are ignored.
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalFormatException
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the format string is illegal or incompatible with the
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             arguments, if there are not enough arguments or if any other
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             error regarding the format string or arguments is detected.
2813106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * @throws NullPointerException if {@code format == null}
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream format(String format, Object... args) {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return format(Locale.getDefault(), format, args);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes a string formatted by an intermediate {@link Formatter} to this
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stream using the specified locale, format string and arguments.
290f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param l
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale used in the method. No localization will be applied
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            if {@code l} is {@code null}.
2945dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     * @param format the format string (see {@link java.util.Formatter#format})
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param args
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the list of arguments passed to the formatter. If there are
2975dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     *            more arguments than required by {@code format},
2985dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     *            additional arguments are ignored.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalFormatException
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the format string is illegal or incompatible with the
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             arguments, if there are not enough arguments or if any other
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             error regarding the format string or arguments is detected.
3045dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     * @throws NullPointerException if {@code format == null}
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream format(Locale l, String format, Object... args) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (format == null) {
308b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new NullPointerException("format == null");
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        new Formatter(this, l).format(format, args);
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Prints a formatted string. The behavior of this method is the same as
31699e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * this stream's {@code #format(String, Object...)} method.
31799e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     *
31899e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * <p>The {@code Locale} used is the user's default locale.
31999e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
320f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
3215dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     * @param format the format string (see {@link java.util.Formatter#format})
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param args
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the list of arguments passed to the formatter. If there are
3245dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     *            more arguments than required by {@code format},
3255dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     *            additional arguments are ignored.
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalFormatException
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the format string is illegal or incompatible with the
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             arguments, if there are not enough arguments or if any other
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             error regarding the format string or arguments is detected.
3315dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     * @throws NullPointerException if {@code format == null}
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream printf(String format, Object... args) {
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return format(format, args);
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Prints a formatted string. The behavior of this method is the same as
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this stream's {@code #format(Locale, String, Object...)} method.
340f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param l
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale used in the method. No localization will be applied
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            if {@code l} is {@code null}.
3445dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     * @param format the format string (see {@link java.util.Formatter#format})
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param args
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the list of arguments passed to the formatter. If there are
3475dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     *            more arguments than required by {@code format},
3485dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     *            additional arguments are ignored.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalFormatException
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the format string is illegal or incompatible with the
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             arguments, if there are not enough arguments or if any other
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             error regarding the format string or arguments is detected.
3545dc59cfad86607a8348c4561ec91584462aa058dElliott Hughes     * @throws NullPointerException if {@code format == null}.
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream printf(Locale l, String format, Object... args) {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return format(l, format, args);
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Put the line separator String onto the print stream.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void newline() {
364b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(System.lineSeparator());
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
368b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the character array {@code chars}.
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
370b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(char[] chars) {
371b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(new String(chars, 0, chars.length));
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
375b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the char {@code c}.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
377b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(char c) {
378b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(c));
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
382b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the double {@code d}.
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
384b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(double d) {
385b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(d));
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
389b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the float {@code f}.
390f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
391b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(float f) {
392b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(f));
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
396b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the int {@code i}.
397f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
398b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(int i) {
399b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(i));
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
403b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the long {@code l}.
404f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
405b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(long l) {
406b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(l));
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
410b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the Object {@code o}, or {@code "null"}.
411f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
412b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(Object o) {
413b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(o));
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Prints a string to the target stream. The string is converted to an array
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of bytes using the encoding chosen during the construction of this
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stream. The bytes are then written to the target stream with
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code write(int)}.
421b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     *
422b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * <p>If an I/O error occurs, this stream's error state is set to {@code true}.
423f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param str
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to print to the target stream.
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #write(int)
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void print(String str) {
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (out == null) {
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setError();
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (str == null) {
434f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            print("null");
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (encoding == null) {
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                write(str.getBytes());
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                write(str.getBytes(encoding));
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setError();
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
450b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the boolean {@code b}.
451f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
452b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void print(boolean b) {
453b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(String.valueOf(b));
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
457b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints a newline.
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void println() {
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        newline();
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
464b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the character array {@code chars} followed by a newline.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
466b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(char[] chars) {
467b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(new String(chars, 0, chars.length));
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
471b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the char {@code c} followed by a newline.
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
473b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(char c) {
474b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(c));
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
478b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the double {@code d} followed by a newline.
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
480b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(double d) {
481b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(d));
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
485b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the float {@code f} followed by a newline.
486f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
487b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes   public void println(float f) {
488b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(f));
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   /**
492b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the int {@code i} followed by a newline.
493f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
494b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(int i) {
495b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(i));
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
499b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the long {@code l} followed by a newline.
500f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
501b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(long l) {
502b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(l));
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
506b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the Object {@code o}, or {@code "null"},
507b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * followed by a newline.
508f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
509b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(Object o) {
510b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(o));
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
514b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints a string followed by a newline. The string is converted to an array of bytes using
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the encoding chosen during the construction of this stream. The bytes are
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then written to the target stream with {@code write(int)}.
517b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     *
518b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * <p>If an I/O error occurs, this stream's error state is set to {@code true}.
519f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param str
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to print to the target stream.
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #write(int)
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void println(String str) {
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        print(str);
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        newline();
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
530b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Prints the string representation of the boolean {@code b} followed by a newline.
531f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
532b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public void println(boolean b) {
533b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        println(String.valueOf(b));
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
537e51cae060bf9543c7b786c3d7f297fab8a551acbElliott Hughes     * Sets the error flag of this print stream to true.
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setError() {
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ioError = true;
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes {@code count} bytes from {@code buffer} starting at {@code offset}
545b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * to the target stream. If autoFlush is set, this stream gets flushed after
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * writing the buffer.
547b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     *
548b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * <p>This stream's error flag is set to {@code true} if this stream is closed
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or an I/O error occurs.
550f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to be written.
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first byte in {@code buffer} to write.
5555839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson     * @param length
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes in {@code buffer} to write.
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code count < 0}, or if {@code
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             offset + count} is bigger than the length of {@code buffer}.
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #flush()
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
5635839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson    public void write(byte[] buffer, int offset, int length) {
564b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkOffsetAndCount(buffer.length, offset, length);
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (out == null) {
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                setError();
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
5715839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson                out.write(buffer, offset, length);
572b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes                if (autoFlush) {
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    flush();
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                setError();
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes one byte to the target stream. Only the least significant byte of
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the integer {@code oneByte} is written. This stream is flushed if
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code oneByte} is equal to the character {@code '\n'} and this stream is
585b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * set to autoFlush.
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This stream's error flag is set to {@code true} if it is closed or an I/O
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * error occurs.
589f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param oneByte
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte to be written
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void write(int oneByte) {
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (out == null) {
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setError();
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            out.write(oneByte);
60155392539fea537abfb6581b474918f9d611fba27Jesse Wilson            int b = oneByte & 0xFF;
60255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            // 0x0A is ASCII newline, 0x15 is EBCDIC newline.
603f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            boolean isNewline = b == 0x0A || b == 0x15;
604b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes            if (autoFlush && isNewline) {
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                flush();
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setError();
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
613b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Appends the char {@code c}.
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PrintStream append(char c) {
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        print(c);
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
622b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Appends the CharSequence {@code charSequence}, or {@code "null"}.
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
625b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public PrintStream append(CharSequence charSequence) {
626b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        if (charSequence == null) {
627b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes            print("null");
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
629b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes            print(charSequence.toString());
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
635b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * Appends a subsequence of CharSequence {@code charSequence}, or {@code "null"}.
636f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
637b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     * @param charSequence
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the character sequence appended to the target stream.
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first char in the character sequence appended
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to the target stream.
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the character following the last character of the
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            subsequence appended to the target stream.
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this stream.
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code start > end}, {@code start < 0}, {@code end < 0} or
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             either {@code start} or {@code end} are greater or equal than
649b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes     *             the length of {@code charSequence}.
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
651b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes    public PrintStream append(CharSequence charSequence, int start, int end) {
652b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        if (charSequence == null) {
653b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes            charSequence = "null";
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
655b4acb463582a510894aeb85f4fa8f35b339449c8Elliott Hughes        print(charSequence.subSequence(start, end).toString());
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
659