196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * this work for additional information regarding copyright ownership.
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (the "License"); you may not use this file except in compliance with
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the License.  You may obtain a copy of the License at
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.commons.io;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.ByteArrayInputStream;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStreamReader;
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream;
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStreamWriter;
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.Reader;
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.StringReader;
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.Writer;
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This class provides static utility methods for buffered
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * copying between sources (<code>InputStream</code>, <code>Reader</code>,
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <code>String</code> and <code>byte[]</code>) and destinations
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (<code>OutputStream</code>, <code>Writer</code>, <code>String</code> and
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <code>byte[]</code>).
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless otherwise noted, these <code>copy</code> methods do <em>not</em>
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * flush or close the streams. Often doing so would require making non-portable
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * assumptions about the streams' origin and further use. This means that both
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * streams' <code>close()</code> methods must be called after copying. if one
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * omits this step, then the stream resources (sockets, file descriptors) are
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * released when the associated Stream is garbage-collected. It is not a good
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * idea to rely on this mechanism. For a good overview of the distinction
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * between "memory management" and "resource management", see
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <a href="http://www.unixreview.com/articles/1998/9804/9804ja/ja.htm">this
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * UnixReview article</a>.
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * For byte-to-char methods, a <code>copy</code> variant allows the encoding
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * to be selected (otherwise the platform default is used). We would like to
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * encourage you to always specify the encoding because relying on the platform
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * default can lead to unexpected results.
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * We don't provide special variants for the <code>copy</code> methods that
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * let you specify the buffer size because in modern VMs the impact on speed
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * seems to be minimal. We're using a default buffer size of 4 KB.
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The <code>copy</code> methods use an internal buffer when copying. It is
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * therefore advisable <em>not</em> to deliberately wrap the stream arguments
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * to the <code>copy</code> methods in <code>Buffered*</code> streams. For
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * example, don't do the following:
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <pre>
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *  copy( new BufferedInputStream( in ), new BufferedOutputStream( out ) );
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *  </pre>
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The rationale is as follows:
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Imagine that an InputStream's read() is a very expensive operation, which
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * would usually suggest wrapping in a BufferedInputStream. The
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * BufferedInputStream works by issuing infrequent
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * {@link java.io.InputStream#read(byte[] b, int off, int len)} requests on the
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * underlying InputStream, to fill an internal buffer, from which further
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <code>read</code> requests can inexpensively get their data (until the buffer
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * runs out).
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * However, the <code>copy</code> methods do the same thing, keeping an
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * internal buffer, populated by
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * {@link InputStream#read(byte[] b, int off, int len)} requests. Having two
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * buffers (or three if the destination stream is also buffered) is pointless,
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * and the unnecessary buffer management hurts performance slightly (about 3%,
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * according to some simple experiments).
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Behold, intrepid explorers; a map of this class:
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <pre>
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *       Method      Input               Output          Dependency
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *       ------      -----               ------          -------
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1     copy        InputStream         OutputStream    (primitive)
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 2     copy        Reader              Writer          (primitive)
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 3     copy        InputStream         Writer          2
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 4     copy        Reader              OutputStream    2
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 5     copy        String              OutputStream    2
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 6     copy        String              Writer          (trivial)
9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 7     copy        byte[]              Writer          3
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 8     copy        byte[]              OutputStream    (trivial)
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </pre>
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Note that only the first two methods shuffle bytes; the rest use these
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * two, or (if possible) copy using native Java copy methods. As there are
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * method variants to specify the encoding, each row may
10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * correspond to up to 2 methods.
10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Origin of code: Excalibur.
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Peter Donald
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Jeff Turner
10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Matthew Hawthorne
10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: CopyUtils.java 437680 2006-08-28 11:57:00Z scolebourne $
10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @deprecated Use IOUtils. Will be removed in 2.0.
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *  Methods renamed to IOUtils.write() or IOUtils.copy().
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *  Null handling behaviour changed in IOUtils (null data does not
11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *  throw NullPointerException).
11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class CopyUtils {
11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * The default size of the buffer.
11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Instances should NOT be constructed in standard programming.
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public CopyUtils() { }
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // byte[] -> OutputStream
12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy bytes from a <code>byte[]</code> to an <code>OutputStream</code>.
13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the byte array to read from
13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>OutputStream</code> to write to
13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(byte[] input, OutputStream output)
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throws IOException {
13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write(input);
13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // byte[] -> Writer
14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy and convert bytes from a <code>byte[]</code> to chars on a
14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>Writer</code>.
14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * The platform's default encoding is used for the byte-to-char conversion.
14996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the byte array to read from
15096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>Writer</code> to write to
15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(byte[] input, Writer output)
15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throws IOException {
15596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        ByteArrayInputStream in = new ByteArrayInputStream(input);
15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        copy(in, output);
15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
15896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
15996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy and convert bytes from a <code>byte[]</code> to chars on a
16296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>Writer</code>, using the specified encoding.
16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the byte array to read from
16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>Writer</code> to write to
16596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param encoding The name of a supported character encoding. See the
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <a href="http://www.iana.org/assignments/character-sets">IANA
16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Charset Registry</a> for a list of valid encoding types.
16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(
17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            byte[] input,
17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Writer output,
17396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String encoding)
17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
17596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        ByteArrayInputStream in = new ByteArrayInputStream(input);
17696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        copy(in, output, encoding);
17796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
17896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
17996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
18096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
18196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // Core copy methods
18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
18596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy bytes from an <code>InputStream</code> to an
18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>OutputStream</code>.
18796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>InputStream</code> to read from
18896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>OutputStream</code> to write to
18996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the number of bytes copied
19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
19196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
19296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int copy(
19396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            InputStream input,
19496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            OutputStream output)
19596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int count = 0;
19896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int n = 0;
19996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        while (-1 != (n = input.read(buffer))) {
20096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            output.write(buffer, 0, n);
20196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            count += n;
20296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
20396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return count;
20496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
20596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
20696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
20796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // Reader -> Writer
20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
20996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy chars from a <code>Reader</code> to a <code>Writer</code>.
21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>Reader</code> to read from
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>Writer</code> to write to
21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the number of characters copied
21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int copy(
21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Reader input,
21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Writer output)
22096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        char[] buffer = new char[DEFAULT_BUFFER_SIZE];
22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int count = 0;
22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int n = 0;
22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        while (-1 != (n = input.read(buffer))) {
22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            output.write(buffer, 0, n);
22696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            count += n;
22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return count;
22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // InputStream -> Writer
23396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
23696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy and convert bytes from an <code>InputStream</code> to chars on a
23796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>Writer</code>.
23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * The platform's default encoding is used for the byte-to-char conversion.
23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>InputStream</code> to read from
24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>Writer</code> to write to
24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(
24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            InputStream input,
24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Writer output)
24696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        InputStreamReader in = new InputStreamReader(input);
24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        copy(in, output);
24996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
25196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy and convert bytes from an <code>InputStream</code> to chars on a
25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>Writer</code>, using the specified encoding.
25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>InputStream</code> to read from
25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>Writer</code> to write to
25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param encoding The name of a supported character encoding. See the
25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <a href="http://www.iana.org/assignments/character-sets">IANA
25896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Charset Registry</a> for a list of valid encoding types.
25996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
26096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
26196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(
26296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            InputStream input,
26396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Writer output,
26496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String encoding)
26596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
26696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        InputStreamReader in = new InputStreamReader(input, encoding);
26796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        copy(in, output);
26896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
26996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
27096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
27196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
27296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // Reader -> OutputStream
27396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
27496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
27596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
27696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Serialize chars from a <code>Reader</code> to bytes on an
27796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>OutputStream</code>, and flush the <code>OutputStream</code>.
27896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>Reader</code> to read from
27996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>OutputStream</code> to write to
28096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
28196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
28296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(
28396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Reader input,
28496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            OutputStream output)
28596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
28696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        OutputStreamWriter out = new OutputStreamWriter(output);
28796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        copy(input, out);
28896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // XXX Unless anyone is planning on rewriting OutputStreamWriter, we
28996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // have to flush here.
29096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        out.flush();
29196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
29296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
29396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
29496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // String -> OutputStream
29596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
29696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
29796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
29896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Serialize chars from a <code>String</code> to bytes on an
29996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>OutputStream</code>, and
30096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * flush the <code>OutputStream</code>.
30196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>String</code> to read from
30296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>OutputStream</code> to write to
30396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
30496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
30596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(
30696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String input,
30796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            OutputStream output)
30896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
30996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        StringReader in = new StringReader(input);
31096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        OutputStreamWriter out = new OutputStreamWriter(output);
31196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        copy(in, out);
31296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // XXX Unless anyone is planning on rewriting OutputStreamWriter, we
31396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // have to flush here.
31496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        out.flush();
31596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
31696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
31796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
31896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // String -> Writer
31996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------------
32096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
32196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
32296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Copy chars from a <code>String</code> to a <code>Writer</code>.
32396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input the <code>String</code> to read from
32496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output the <code>Writer</code> to write to
32596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException In case of an I/O problem
32696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
32796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void copy(String input, Writer output)
32896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throws IOException {
32996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write(input);
33096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
33196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
33296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
333