1bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/*
2bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Licensed to the Apache Software Foundation (ASF) under one or more
3bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * contributor license agreements.  See the NOTICE file distributed with
4bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * this work for additional information regarding copyright ownership.
5bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * The ASF licenses this file to You under the Apache License, Version 2.0
6bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * (the "License"); you may not use this file except in compliance with
7bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * the License.  You may obtain a copy of the License at
8bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
9bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *      http://www.apache.org/licenses/LICENSE-2.0
10bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
11bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Unless required by applicable law or agreed to in writing, software
12bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS,
13bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * See the License for the specific language governing permissions and
15bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * limitations under the License.
16bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */
17bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpackage org.apache.commons.io;
18bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
19bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.BufferedInputStream;
20bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.BufferedReader;
21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.ByteArrayInputStream;
22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.CharArrayWriter;
23bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.File;
24bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.IOException;
25bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.InputStream;
26bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.InputStreamReader;
27bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.OutputStream;
28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.OutputStreamWriter;
29bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.PrintWriter;
30bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.Reader;
31bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.StringWriter;
32bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.Writer;
33bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.ArrayList;
34bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.Collection;
35bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.Iterator;
36bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.List;
37bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport org.apache.commons.io.output.ByteArrayOutputStream;
39bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/**
41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * General IO stream manipulation utilities.
42bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <p>
43bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * This class provides static utility methods for input/output operations.
44bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <ul>
45bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <li>closeQuietly - these methods close a stream ignoring nulls and exceptions
46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <li>toXxx/read - these methods read data from a stream
47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <li>write - these methods write data to a stream
48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <li>copy - these methods copy all the data from one stream to another
49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <li>contentEquals - these methods compare the content of two streams
50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * </ul>
51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <p>
52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * The byte-to-char methods and char-to-byte methods involve a conversion step.
53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Two methods are provided in each case, one that uses the platform default
54bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * encoding and the other which allows you to specify an encoding. You are
55bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * encouraged to always specify an encoding because relying on the platform
56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * default can lead to unexpected results, for example when moving from
57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * development to production.
58bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <p>
59bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * All the methods in this class that read a stream are buffered internally.
60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * This means that there is no cause to use a <code>BufferedInputStream</code>
61bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * or <code>BufferedReader</code>. The default buffer size of 4K has been shown
62bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * to be efficient in tests.
63bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <p>
64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Wherever possible, the methods in this class do <em>not</em> flush or close
65bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * the stream. This is to avoid making non-portable assumptions about the
66bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * streams' origin and further use. Thus the caller is still responsible for
67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * closing streams after use.
68bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <p>
69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Origin of code: Excalibur.
70bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
71bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Peter Donald
72bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Jeff Turner
73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Matthew Hawthorne
74bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Stephen Colebourne
75bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Gareth Davis
76bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Ian Springer
77bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Niall Pemberton
78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @author Sandy McArthur
79bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * @version $Id: IOUtils.java 481854 2006-12-03 18:30:07Z scolebourne $
80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */
81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic class IOUtils {
82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // NOTE: This class is focussed on InputStream, OutputStream, Reader and
83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // Writer. Each method should take at least one of these as a parameter,
84bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // or return one of them.
85bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
87bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The Unix directory separator character.
88bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static final char DIR_SEPARATOR_UNIX = '/';
90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
91bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The Windows directory separator character.
92bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
93bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static final char DIR_SEPARATOR_WINDOWS = '\\';
94bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
95bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The system directory separator character.
96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static final char DIR_SEPARATOR = File.separatorChar;
98bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
99bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The Unix line separator string.
100bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static final String LINE_SEPARATOR_UNIX = "\n";
102bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
103bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The Windows line separator string.
104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
105bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static final String LINE_SEPARATOR_WINDOWS = "\r\n";
106bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The system line separator string.
108bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
109bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static final String LINE_SEPARATOR;
110bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    static {
111bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        // avoid security issues
112bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        StringWriter buf = new StringWriter(4);
113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        PrintWriter out = new PrintWriter(buf);
114bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        out.println();
115bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        LINE_SEPARATOR = buf.toString();
116bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
117bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
119bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The default buffer size to use.
120bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
122bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
123bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
124bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Instances should NOT be constructed in standard programming.
125bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
126bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public IOUtils() {
127bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        super();
128bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
129bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
130bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
131bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
132bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Unconditionally close an <code>Reader</code>.
133bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
134bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Equivalent to {@link Reader#close()}, except any exceptions will be ignored.
135bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This is typically used in finally blocks.
136bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
137bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the Reader to close, may be null or already closed
138bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
139bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void closeQuietly(Reader input) {
140bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        try {
141bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (input != null) {
142bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                input.close();
143bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
144bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } catch (IOException ioe) {
145bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // ignore
146bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
147bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
148bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
149bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
150bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Unconditionally close a <code>Writer</code>.
151bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
152bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Equivalent to {@link Writer#close()}, except any exceptions will be ignored.
153bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This is typically used in finally blocks.
154bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
155bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the Writer to close, may be null or already closed
156bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
157bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void closeQuietly(Writer output) {
158bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        try {
159bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (output != null) {
160bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.close();
161bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
162bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } catch (IOException ioe) {
163bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // ignore
164bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
165bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
166bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
167bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
168bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Unconditionally close an <code>InputStream</code>.
169bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
170bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Equivalent to {@link InputStream#close()}, except any exceptions will be ignored.
171bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This is typically used in finally blocks.
172bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
173bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the InputStream to close, may be null or already closed
174bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
175bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void closeQuietly(InputStream input) {
176bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        try {
177bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (input != null) {
178bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                input.close();
179bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
180bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } catch (IOException ioe) {
181bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // ignore
182bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
183bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
184bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
185bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
186bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Unconditionally close an <code>OutputStream</code>.
187bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
188bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Equivalent to {@link OutputStream#close()}, except any exceptions will be ignored.
189bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This is typically used in finally blocks.
190bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
191bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the OutputStream to close, may be null or already closed
192bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
193bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void closeQuietly(OutputStream output) {
194bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        try {
195bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (output != null) {
196bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.close();
197bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
198bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } catch (IOException ioe) {
199bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // ignore
200bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
201bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
202bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
203bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // read toByteArray
204bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
205bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
206bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a <code>byte[]</code>.
207bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
208bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
209bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
210bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
211bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
212bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested byte array
213bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
214bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
215bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
216bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static byte[] toByteArray(InputStream input) throws IOException {
217bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        ByteArrayOutputStream output = new ByteArrayOutputStream();
218bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, output);
219bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return output.toByteArray();
220bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
221bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
222bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
223bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>Reader</code> as a <code>byte[]</code>
224bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
225bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
226bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
227bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
228bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
229bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
230bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested byte array
231bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
232bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
233bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
234bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static byte[] toByteArray(Reader input) throws IOException {
235bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        ByteArrayOutputStream output = new ByteArrayOutputStream();
236bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, output);
237bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return output.toByteArray();
238bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
239bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
240bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
241bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>Reader</code> as a <code>byte[]</code>
242bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the specified character encoding.
243bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
244bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
245bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
246bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
247bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
248bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
249bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
250bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
251bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
252bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested byte array
253bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
254bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
255bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
256bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
257bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static byte[] toByteArray(Reader input, String encoding)
258bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
259bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        ByteArrayOutputStream output = new ByteArrayOutputStream();
260bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, output, encoding);
261bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return output.toByteArray();
262bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
263bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
264bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
265bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>String</code> as a <code>byte[]</code>
266bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
267bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
268bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This is the same as {@link String#getBytes()}.
269bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
270bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>String</code> to convert
271bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested byte array
272bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
273bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs (never occurs)
274bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @deprecated Use {@link String#getBytes()}
275bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
276bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static byte[] toByteArray(String input) throws IOException {
277bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return input.getBytes();
278bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
279bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
280bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // read char[]
281bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
282bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
283bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a character array
284bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
285bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
286bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
287bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
288bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
289bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param is  the <code>InputStream</code> to read from
290bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested character array
291bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
292bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
293bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
294bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
295bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static char[] toCharArray(InputStream is) throws IOException {
296bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        CharArrayWriter output = new CharArrayWriter();
297bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(is, output);
298bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return output.toCharArray();
299bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
300bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
301bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
302bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a character array
303bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the specified character encoding.
304bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
305bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
306bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
307bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
308bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
309bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
310bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
311bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param is  the <code>InputStream</code> to read from
312bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
313bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested character array
314bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
315bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
316bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
317bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
318bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static char[] toCharArray(InputStream is, String encoding)
319bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
320bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        CharArrayWriter output = new CharArrayWriter();
321bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(is, output, encoding);
322bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return output.toCharArray();
323bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
324bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
325bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
326bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>Reader</code> as a character array.
327bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
328bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
329bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
330bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
331bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
332bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested character array
333bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
334bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
335bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
336bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
337bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static char[] toCharArray(Reader input) throws IOException {
338bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        CharArrayWriter sw = new CharArrayWriter();
339bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, sw);
340bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return sw.toCharArray();
341bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
342bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
343bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // read toString
344bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
345bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
346bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a String
347bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
348bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
349bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
350bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
351bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
352bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
353bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested String
354bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
355bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
356bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
357bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static String toString(InputStream input) throws IOException {
358bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        StringWriter sw = new StringWriter();
359bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, sw);
360bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return sw.toString();
361bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
362bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
363bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
364bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a String
365bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the specified character encoding.
366bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
367bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
368bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
369bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
370bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
371bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
372bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
373bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
374bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
375bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested String
376bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
377bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
378bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
379bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static String toString(InputStream input, String encoding)
380bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
381bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        StringWriter sw = new StringWriter();
382bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, sw, encoding);
383bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return sw.toString();
384bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
385bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
386bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
387bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>Reader</code> as a String.
388bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
389bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
390bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
391bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
392bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
393bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested String
394bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
395bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
396bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
397bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static String toString(Reader input) throws IOException {
398bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        StringWriter sw = new StringWriter();
399bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, sw);
400bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return sw.toString();
401bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
402bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
403bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
404bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>byte[]</code> as a String
405bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
406bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
407bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input the byte array to read from
408bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested String
409bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
410bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs (never occurs)
411bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @deprecated Use {@link String#String(byte[])}
412bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
413bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static String toString(byte[] input) throws IOException {
414bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new String(input);
415bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
416bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
417bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
418bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>byte[]</code> as a String
419bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the specified character encoding.
420bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
421bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
422bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
423bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
424bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input the byte array to read from
425bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
426bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the requested String
427bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
428bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs (never occurs)
429bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @deprecated Use {@link String#String(byte[],String)}
430bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
431bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static String toString(byte[] input, String encoding)
432bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
433bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (encoding == null) {
434bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return new String(input);
435bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
436bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return new String(input, encoding);
437bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
438bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
439bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
440bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // readLines
441bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
442bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
443bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a list of Strings,
444bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * one entry per line, using the default character encoding of the platform.
445bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
446bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
447bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
448bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
449bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from, not null
450bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the list of Strings, never null
451bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
452bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
453bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
454bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
455bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static List<String> readLines(InputStream input) throws IOException {
456bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        InputStreamReader reader = new InputStreamReader(input);
457bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return readLines(reader);
458bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
459bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
460bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
461bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of an <code>InputStream</code> as a list of Strings,
462bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * one entry per line, using the specified character encoding.
463bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
464bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
465bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
466bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
467bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
468bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
469bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
470bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from, not null
471bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
472bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the list of Strings, never null
473bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
474bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
475bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
476bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
477bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static List<String> readLines(InputStream input, String encoding) throws IOException {
478bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (encoding == null) {
479bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return readLines(input);
480bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
481bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            InputStreamReader reader = new InputStreamReader(input, encoding);
482bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return readLines(reader);
483bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
484bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
485bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
486bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
487bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Get the contents of a <code>Reader</code> as a list of Strings,
488bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * one entry per line.
489bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
490bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
491bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
492bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
493bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from, not null
494bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the list of Strings, never null
495bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
496bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
497bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
498bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
499bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static List<String> readLines(Reader input) throws IOException {
500bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        BufferedReader reader = new BufferedReader(input);
501bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        List<String> list = new ArrayList<String>();
502bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        String line = reader.readLine();
503bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        while (line != null) {
504bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            list.add(line);
505bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            line = reader.readLine();
506bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
507bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return list;
508bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
509bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
510bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // lineIterator
511bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
512bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
513bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Return an Iterator for the lines in a <code>Reader</code>.
514bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
515bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>LineIterator</code> holds a reference to the open
516bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>Reader</code> specified here. When you have finished with the
517bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * iterator you should close the reader to free internal resources.
518bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This can be done by closing the reader directly, or by calling
519bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@link LineIterator#close()} or {@link LineIterator#closeQuietly(LineIterator)}.
520bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
521bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The recommended usage pattern is:
522bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <pre>
523bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * try {
524bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   LineIterator it = IOUtils.lineIterator(reader);
525bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   while (it.hasNext()) {
526bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *     String line = it.nextLine();
527bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *     /// do something with line
528bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   }
529bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * } finally {
530bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   IOUtils.closeQuietly(reader);
531bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * }
532bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * </pre>
533bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
534bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param reader  the <code>Reader</code> to read from, not null
535bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return an Iterator of the lines in the reader, never null
536bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IllegalArgumentException if the reader is null
537bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.2
538bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
539bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static LineIterator lineIterator(Reader reader) {
540bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new LineIterator(reader);
541bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
542bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
543bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
544bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Return an Iterator for the lines in an <code>InputStream</code>, using
545bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * the character encoding specified (or default encoding if null).
546bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
547bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>LineIterator</code> holds a reference to the open
548bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>InputStream</code> specified here. When you have finished with
549bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * the iterator you should close the stream to free internal resources.
550bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This can be done by closing the stream directly, or by calling
551bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@link LineIterator#close()} or {@link LineIterator#closeQuietly(LineIterator)}.
552bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
553bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The recommended usage pattern is:
554bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <pre>
555bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * try {
556bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   LineIterator it = IOUtils.lineIterator(stream, "UTF-8");
557bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   while (it.hasNext()) {
558bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *     String line = it.nextLine();
559bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *     /// do something with line
560bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   }
561bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * } finally {
562bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *   IOUtils.closeQuietly(stream);
563bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * }
564bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * </pre>
565bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
566bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from, not null
567bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
568bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return an Iterator of the lines in the reader, never null
569bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IllegalArgumentException if the input is null
570bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs, such as if the encoding is invalid
571bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.2
572bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
573bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static LineIterator lineIterator(InputStream input, String encoding)
574bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                     throws IOException {
575bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Reader reader = null;
576bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (encoding == null) {
577bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            reader = new InputStreamReader(input);
578bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
579bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            reader = new InputStreamReader(input, encoding);
580bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
581bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new LineIterator(reader);
582bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
583bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
584bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
585bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
586bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Convert the specified string to an input stream, encoded as bytes
587bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
588bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
589bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input the string to convert
590bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return an input stream
591bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
592bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
593bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static InputStream toInputStream(String input) {
594bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        byte[] bytes = input.getBytes();
595bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new ByteArrayInputStream(bytes);
596bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
597bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
598bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
599bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Convert the specified string to an input stream, encoded as bytes
600bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the specified character encoding.
601bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
602bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
603bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
604bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
605bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input the string to convert
606bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding the encoding to use, null means platform default
607bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if the encoding is invalid
608bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return an input stream
609bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
610bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
611bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static InputStream toInputStream(String input, String encoding) throws IOException {
612bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        byte[] bytes = encoding != null ? input.getBytes(encoding) : input.getBytes();
613bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new ByteArrayInputStream(bytes);
614bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
615bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
616bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // write byte[]
617bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
618bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
619bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes bytes from a <code>byte[]</code> to an <code>OutputStream</code>.
620bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
621bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the byte array to write, do not modify during output,
622bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * null ignored
623bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
624bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
625bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
626bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
627bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
628bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(byte[] data, OutputStream output)
629bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
630bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
631bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(data);
632bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
633bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
634bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
635bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
636bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes bytes from a <code>byte[]</code> to chars on a <code>Writer</code>
637bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
638bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
639bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#String(byte[])}.
640bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
641bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the byte array to write, do not modify during output,
642bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * null ignored
643bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
644bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
645bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
646bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
647bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
648bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(byte[] data, Writer output) throws IOException {
649bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
650bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(new String(data));
651bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
652bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
653bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
654bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
655bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes bytes from a <code>byte[]</code> to chars on a <code>Writer</code>
656bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the specified character encoding.
657bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
658bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
659bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
660bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
661bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#String(byte[], String)}.
662bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
663bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the byte array to write, do not modify during output,
664bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * null ignored
665bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
666bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
667bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
668bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
669bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
670bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
671bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(byte[] data, Writer output, String encoding)
672bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
673bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
674bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (encoding == null) {
675bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                write(data, output);
676bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } else {
677bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.write(new String(data, encoding));
678bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
679bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
680bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
681bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
682bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // write char[]
683bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
684bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
685bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>char[]</code> to a <code>Writer</code>
686bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * using the default character encoding of the platform.
687bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
688bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the char array to write, do not modify during output,
689bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * null ignored
690bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
691bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
692bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
693bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
694bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
695bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(char[] data, Writer output) throws IOException {
696bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
697bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(data);
698bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
699bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
700bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
701bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
702bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>char[]</code> to bytes on an
703bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code>.
704bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
705bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#String(char[])} and
706bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@link String#getBytes()}.
707bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
708bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the char array to write, do not modify during output,
709bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * null ignored
710bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
711bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
712bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
713bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
714bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
715bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(char[] data, OutputStream output)
716bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
717bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
718bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(new String(data).getBytes());
719bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
720bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
721bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
722bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
723bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>char[]</code> to bytes on an
724bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the specified character encoding.
725bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
726bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
727bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
728bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
729bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#String(char[])} and
730bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@link String#getBytes(String)}.
731bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
732bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the char array to write, do not modify during output,
733bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * null ignored
734bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
735bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
736bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
737bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
738bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
739bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
740bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(char[] data, OutputStream output, String encoding)
741bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
742bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
743bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (encoding == null) {
744bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                write(data, output);
745bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } else {
746bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.write(new String(data).getBytes(encoding));
747bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
748bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
749bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
750bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
751bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // write String
752bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
753bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
754bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>String</code> to a <code>Writer</code>.
755bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
756bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the <code>String</code> to write, null ignored
757bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
758bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
759bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
760bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
761bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
762bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(String data, Writer output) throws IOException {
763bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
764bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(data);
765bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
766bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
767bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
768bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
769bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>String</code> to bytes on an
770bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the default character encoding of the
771bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * platform.
772bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
773bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#getBytes()}.
774bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
775bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the <code>String</code> to write, null ignored
776bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
777bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
778bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
779bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
780bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
781bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(String data, OutputStream output)
782bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
783bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
784bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(data.getBytes());
785bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
786bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
787bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
788bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
789bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>String</code> to bytes on an
790bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the specified character encoding.
791bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
792bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
793bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
794bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
795bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#getBytes(String)}.
796bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
797bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the <code>String</code> to write, null ignored
798bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
799bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
800bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
801bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
802bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
803bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
804bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(String data, OutputStream output, String encoding)
805bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
806bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
807bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (encoding == null) {
808bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                write(data, output);
809bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } else {
810bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.write(data.getBytes(encoding));
811bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
812bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
813bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
814bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
815bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // write StringBuffer
816bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
817bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
818bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>StringBuffer</code> to a <code>Writer</code>.
819bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
820bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the <code>StringBuffer</code> to write, null ignored
821bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
822bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
823bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
824bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
825bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
826bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(StringBuffer data, Writer output)
827bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
828bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
829bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(data.toString());
830bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
831bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
832bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
833bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
834bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>StringBuffer</code> to bytes on an
835bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the default character encoding of the
836bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * platform.
837bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
838bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#getBytes()}.
839bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
840bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the <code>StringBuffer</code> to write, null ignored
841bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
842bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
843bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
844bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
845bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
846bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(StringBuffer data, OutputStream output)
847bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
848bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
849bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(data.toString().getBytes());
850bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
851bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
852bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
853bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
854bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes chars from a <code>StringBuffer</code> to bytes on an
855bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the specified character encoding.
856bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
857bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
858bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
859bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
860bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link String#getBytes(String)}.
861bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
862bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param data  the <code>StringBuffer</code> to write, null ignored
863bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
864bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
865bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if output is null
866bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
867bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
868bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
869bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void write(StringBuffer data, OutputStream output,
870bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            String encoding) throws IOException {
871bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (data != null) {
872bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (encoding == null) {
873bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                write(data, output);
874bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } else {
875bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.write(data.toString().getBytes(encoding));
876bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
877bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
878bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
879bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
880bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // writeLines
881bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
882bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
883bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes the <code>toString()</code> value of each item in a collection to
884bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * an <code>OutputStream</code> line by line, using the default character
885bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * encoding of the platform and the specified line ending.
886bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
887bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param lines  the lines to write, null entries produce blank lines
888bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param lineEnding  the line separator to use, null is system default
889bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to, not null, not closed
890bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the output is null
891bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
892bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
893bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
894bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void writeLines(Collection<Object> lines, String lineEnding,
895bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            OutputStream output) throws IOException {
896bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (lines == null) {
897bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return;
898bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
899bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (lineEnding == null) {
900bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            lineEnding = LINE_SEPARATOR;
901bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
902bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        for (Iterator<Object> it = lines.iterator(); it.hasNext(); ) {
903bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            Object line = it.next();
904bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (line != null) {
905bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.write(line.toString().getBytes());
906bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
907bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(lineEnding.getBytes());
908bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
909bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
910bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
911bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
912bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes the <code>toString()</code> value of each item in a collection to
913bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * an <code>OutputStream</code> line by line, using the specified character
914bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * encoding and the specified line ending.
915bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
916bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
917bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
918bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
919bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param lines  the lines to write, null entries produce blank lines
920bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param lineEnding  the line separator to use, null is system default
921bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to, not null, not closed
922bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
923bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the output is null
924bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
925bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
926bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
927bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void writeLines(Collection<Object> lines, String lineEnding,
928bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            OutputStream output, String encoding) throws IOException {
929bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (encoding == null) {
930bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            writeLines(lines, lineEnding, output);
931bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
932bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (lines == null) {
933bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return;
934bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
935bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (lineEnding == null) {
936bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                lineEnding = LINE_SEPARATOR;
937bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
938bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            for (Iterator<Object> it = lines.iterator(); it.hasNext(); ) {
939bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                Object line = it.next();
940bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (line != null) {
941bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    output.write(line.toString().getBytes(encoding));
942bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
943bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                output.write(lineEnding.getBytes(encoding));
944bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
945bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
946bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
947bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
948bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
949bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Writes the <code>toString()</code> value of each item in a collection to
950bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * a <code>Writer</code> line by line, using the specified line ending.
951bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
952bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param lines  the lines to write, null entries produce blank lines
953bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param lineEnding  the line separator to use, null is system default
954bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param writer  the <code>Writer</code> to write to, not null, not closed
955bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input is null
956bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
957bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
958bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
959bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void writeLines(Collection<Object> lines, String lineEnding,
960bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            Writer writer) throws IOException {
961bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (lines == null) {
962bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return;
963bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
964bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (lineEnding == null) {
965bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            lineEnding = LINE_SEPARATOR;
966bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
967bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        for (Iterator<Object> it = lines.iterator(); it.hasNext(); ) {
968bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            Object line = it.next();
969bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (line != null) {
970bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                writer.write(line.toString());
971bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
972bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            writer.write(lineEnding);
973bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
974bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
975bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
976bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // copy from InputStream
977bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
978bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
979bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy bytes from an <code>InputStream</code> to an
980bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code>.
981bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
982bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
983bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
984bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
985bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Large streams (over 2GB) will return a bytes copied value of
986bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>-1</code> after the copy has completed since the correct
987bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * number of bytes cannot be returned as an int. For large streams
988bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * use the <code>copyLarge(InputStream, OutputStream)</code> method.
989bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
990bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
991bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
992bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the number of bytes copied
993bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
994bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
995bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws ArithmeticException if the byte count is too large
996bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
997bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
998bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static int copy(InputStream input, OutputStream output) throws IOException {
999bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        long count = copyLarge(input, output);
1000bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (count > Integer.MAX_VALUE) {
1001bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return -1;
1002bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1003bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (int) count;
1004bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1005bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1006bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1007bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy bytes from a large (over 2GB) <code>InputStream</code> to an
1008bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code>.
1009bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1010bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1011bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
1012bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1013bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
1014bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
1015bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the number of bytes copied
1016bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1017bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1018bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.3
1019bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1020bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static long copyLarge(InputStream input, OutputStream output)
1021bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1022bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
1023bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        long count = 0;
1024bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int n = 0;
1025bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        while (-1 != (n = input.read(buffer))) {
1026bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(buffer, 0, n);
1027bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            count += n;
1028bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1029bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return count;
1030bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1031bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1032bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1033bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy bytes from an <code>InputStream</code> to chars on a
1034bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>Writer</code> using the default character encoding of the platform.
1035bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1036bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1037bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
1038bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1039bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link InputStreamReader}.
1040bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1041bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
1042bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
1043bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1044bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1045bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
1046bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1047bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void copy(InputStream input, Writer output)
1048bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1049bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        InputStreamReader in = new InputStreamReader(input);
1050bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(in, output);
1051bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1052bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1053bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1054bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy bytes from an <code>InputStream</code> to chars on a
1055bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>Writer</code> using the specified character encoding.
1056bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1057bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1058bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code>.
1059bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1060bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
1061bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
1062bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1063bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link InputStreamReader}.
1064bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1065bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>InputStream</code> to read from
1066bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
1067bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
1068bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1069bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1070bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
1071bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1072bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void copy(InputStream input, Writer output, String encoding)
1073bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1074bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (encoding == null) {
1075bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            copy(input, output);
1076bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
1077bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            InputStreamReader in = new InputStreamReader(input, encoding);
1078bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            copy(in, output);
1079bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1080bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1081bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1082bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // copy from Reader
1083bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
1084bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1085bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy chars from a <code>Reader</code> to a <code>Writer</code>.
1086bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1087bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1088bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
1089bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1090bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Large streams (over 2GB) will return a chars copied value of
1091bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>-1</code> after the copy has completed since the correct
1092bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * number of chars cannot be returned as an int. For large streams
1093bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * use the <code>copyLarge(Reader, Writer)</code> method.
1094bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1095bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
1096bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
1097bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the number of characters copied
1098bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1099bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1100bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws ArithmeticException if the character count is too large
1101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
1102bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1103bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static int copy(Reader input, Writer output) throws IOException {
1104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        long count = copyLarge(input, output);
1105bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (count > Integer.MAX_VALUE) {
1106bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return -1;
1107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1108bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (int) count;
1109bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1110bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1111bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1112bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy chars from a large (over 2GB) <code>Reader</code> to a <code>Writer</code>.
1113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1114bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1115bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
1116bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1117bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
1118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>Writer</code> to write to
1119bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return the number of characters copied
1120bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1122bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.3
1123bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1124bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static long copyLarge(Reader input, Writer output) throws IOException {
1125bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        char[] buffer = new char[DEFAULT_BUFFER_SIZE];
1126bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        long count = 0;
1127bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int n = 0;
1128bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        while (-1 != (n = input.read(buffer))) {
1129bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            output.write(buffer, 0, n);
1130bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            count += n;
1131bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1132bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return count;
1133bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1134bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1135bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1136bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy chars from a <code>Reader</code> to bytes on an
1137bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the default character encoding of the
1138bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * platform, and calling flush.
1139bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1140bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1141bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
1142bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1143bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Due to the implementation of OutputStreamWriter, this method performs a
1144bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * flush.
1145bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1146bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link OutputStreamWriter}.
1147bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1148bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
1149bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
1150bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1151bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1152bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
1153bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1154bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void copy(Reader input, OutputStream output)
1155bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1156bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        OutputStreamWriter out = new OutputStreamWriter(output);
1157bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        copy(input, out);
1158bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        // XXX Unless anyone is planning on rewriting OutputStreamWriter, we
1159bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        // have to flush here.
1160bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        out.flush();
1161bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1162bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1163bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1164bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Copy chars from a <code>Reader</code> to bytes on an
1165bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>OutputStream</code> using the specified character encoding, and
1166bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * calling flush.
1167bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1168bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally, so there is no need to use a
1169bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code>.
1170bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1171bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Character encoding names can be found at
1172bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
1173bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1174bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Due to the implementation of OutputStreamWriter, this method performs a
1175bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * flush.
1176bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1177bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method uses {@link OutputStreamWriter}.
1178bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1179bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input  the <code>Reader</code> to read from
1180bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param output  the <code>OutputStream</code> to write to
1181bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param encoding  the encoding to use, null means platform default
1182bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if the input or output is null
1183bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1184bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
1185bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1186bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void copy(Reader input, OutputStream output, String encoding)
1187bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1188bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (encoding == null) {
1189bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            copy(input, output);
1190bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
1191bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            OutputStreamWriter out = new OutputStreamWriter(output, encoding);
1192bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            copy(input, out);
1193bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // XXX Unless anyone is planning on rewriting OutputStreamWriter,
1194bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // we have to flush here.
1195bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            out.flush();
1196bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1197bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1198bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1199bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    // content equals
1200bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    //-----------------------------------------------------------------------
1201bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1202bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Compare the contents of two Streams to determine if they are equal or
1203bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * not.
1204bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1205bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally using
1206bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedInputStream</code> if they are not already buffered.
1207bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1208bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input1  the first stream
1209bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input2  the second stream
1210bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return true if the content of the streams are equal or they both don't
1211bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * exist, false otherwise
1212bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if either input is null
1213bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1214bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1215bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static boolean contentEquals(InputStream input1, InputStream input2)
1216bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1217bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (!(input1 instanceof BufferedInputStream)) {
1218bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            input1 = new BufferedInputStream(input1);
1219bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1220bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (!(input2 instanceof BufferedInputStream)) {
1221bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            input2 = new BufferedInputStream(input2);
1222bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1223bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1224bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int ch = input1.read();
1225bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        while (-1 != ch) {
1226bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            int ch2 = input2.read();
1227bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (ch != ch2) {
1228bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return false;
1229bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
1230bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            ch = input1.read();
1231bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1232bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1233bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int ch2 = input2.read();
1234bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (ch2 == -1);
1235bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1236bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1237bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
1238bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Compare the contents of two Readers to determine if they are equal or
1239bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * not.
1240bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>
1241bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * This method buffers the input internally using
1242bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <code>BufferedReader</code> if they are not already buffered.
1243bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
1244bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input1  the first reader
1245bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param input2  the second reader
1246bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return true if the content of the readers are equal or they both don't
1247bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * exist, false otherwise
1248bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws NullPointerException if either input is null
1249bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @throws IOException if an I/O error occurs
1250bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @since Commons IO 1.1
1251bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
1252bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static boolean contentEquals(Reader input1, Reader input2)
1253bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throws IOException {
1254bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (!(input1 instanceof BufferedReader)) {
1255bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            input1 = new BufferedReader(input1);
1256bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1257bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (!(input2 instanceof BufferedReader)) {
1258bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            input2 = new BufferedReader(input2);
1259bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1260bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1261bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int ch = input1.read();
1262bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        while (-1 != ch) {
1263bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            int ch2 = input2.read();
1264bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (ch != ch2) {
1265bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return false;
1266bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
1267bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            ch = input1.read();
1268bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
1269bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1270bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int ch2 = input2.read();
1271bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (ch2 == -1);
1272bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
1273bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
1274bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook}
1275