14ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/* 24ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Licensed to the Apache Software Foundation (ASF) under one or more 34ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * contributor license agreements. See the NOTICE file distributed with 44ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * this work for additional information regarding copyright ownership. 54ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The ASF licenses this file to You under the Apache License, Version 2.0 64ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * (the "License"); you may not use this file except in compliance with 74ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * the License. You may obtain a copy of the License at 84ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 94ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Unless required by applicable law or agreed to in writing, software 124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * See the License for the specific language governing permissions and 154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * limitations under the License. 164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapackage org.apache.commons.io; 184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.ByteArrayInputStream; 204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.IOException; 214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.InputStream; 224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.InputStreamReader; 234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.OutputStream; 244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.OutputStreamWriter; 254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.Reader; 264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.StringReader; 274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.Writer; 284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/** 304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * This class provides static utility methods for buffered 314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * copying between sources (<code>InputStream</code>, <code>Reader</code>, 324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>String</code> and <code>byte[]</code>) and destinations 334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * (<code>OutputStream</code>, <code>Writer</code>, <code>String</code> and 344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>byte[]</code>). 354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Unless otherwise noted, these <code>copy</code> methods do <em>not</em> 374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * flush or close the streams. Often doing so would require making non-portable 384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * assumptions about the streams' origin and further use. This means that both 394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * streams' <code>close()</code> methods must be called after copying. if one 404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * omits this step, then the stream resources (sockets, file descriptors) are 414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * released when the associated Stream is garbage-collected. It is not a good 424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * idea to rely on this mechanism. For a good overview of the distinction 434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * between "memory management" and "resource management", see 444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <a href="http://www.unixreview.com/articles/1998/9804/9804ja/ja.htm">this 454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * UnixReview article</a>. 464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * For byte-to-char methods, a <code>copy</code> variant allows the encoding 484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * to be selected (otherwise the platform default is used). We would like to 494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * encourage you to always specify the encoding because relying on the platform 504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * default can lead to unexpected results. 514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p 524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * We don't provide special variants for the <code>copy</code> methods that 534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * let you specify the buffer size because in modern VMs the impact on speed 544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * seems to be minimal. We're using a default buffer size of 4 KB. 554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The <code>copy</code> methods use an internal buffer when copying. It is 574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * therefore advisable <em>not</em> to deliberately wrap the stream arguments 584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * to the <code>copy</code> methods in <code>Buffered*</code> streams. For 594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * example, don't do the following: 604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <pre> 614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * copy( new BufferedInputStream( in ), new BufferedOutputStream( out ) ); 624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * </pre> 634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The rationale is as follows: 644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Imagine that an InputStream's read() is a very expensive operation, which 664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * would usually suggest wrapping in a BufferedInputStream. The 674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * BufferedInputStream works by issuing infrequent 684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * {@link java.io.InputStream#read(byte[] b, int off, int len)} requests on the 694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * underlying InputStream, to fill an internal buffer, from which further 704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>read</code> requests can inexpensively get their data (until the buffer 714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * runs out). 724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * However, the <code>copy</code> methods do the same thing, keeping an 744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * internal buffer, populated by 754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * {@link InputStream#read(byte[] b, int off, int len)} requests. Having two 764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * buffers (or three if the destination stream is also buffered) is pointless, 774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * and the unnecessary buffer management hurts performance slightly (about 3%, 784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * according to some simple experiments). 794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Behold, intrepid explorers; a map of this class: 814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <pre> 824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Method Input Output Dependency 834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * ------ ----- ------ ------- 844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 1 copy InputStream OutputStream (primitive) 854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 2 copy Reader Writer (primitive) 864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 3 copy InputStream Writer 2 884ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 894ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 4 copy Reader OutputStream 2 904ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 914ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 5 copy String OutputStream 2 924ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 6 copy String Writer (trivial) 934ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 944ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 7 copy byte[] Writer 3 954ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 8 copy byte[] OutputStream (trivial) 964ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * </pre> 974ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 984ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Note that only the first two methods shuffle bytes; the rest use these 994ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * two, or (if possible) copy using native Java copy methods. As there are 1004ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * method variants to specify the encoding, each row may 1014ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * correspond to up to 2 methods. 1024ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p> 1034ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Origin of code: Excalibur. 1044ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * 1054ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @author Peter Donald 1064ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @author Jeff Turner 1074ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @author Matthew Hawthorne 1084ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @version $Id: CopyUtils.java 437680 2006-08-28 11:57:00Z scolebourne $ 1094ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @deprecated Use IOUtils. Will be removed in 2.0. 1104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Methods renamed to IOUtils.write() or IOUtils.copy(). 1114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Null handling behaviour changed in IOUtils (null data does not 1124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * throw NullPointerException). 1134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapublic class CopyUtils { 1154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 1174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The default size of the buffer. 1184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; 1204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 1224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Instances should NOT be constructed in standard programming. 1234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public CopyUtils() { } 1254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 1274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // byte[] -> OutputStream 1284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 1294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 1314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy bytes from a <code>byte[]</code> to an <code>OutputStream</code>. 1324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the byte array to read from 1334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>OutputStream</code> to write to 1344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 1354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy(byte[] input, OutputStream output) 1374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 1384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira output.write(input); 1394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 1404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 1424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // byte[] -> Writer 1434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 1444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 1464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy and convert bytes from a <code>byte[]</code> to chars on a 1474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>Writer</code>. 1484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The platform's default encoding is used for the byte-to-char conversion. 1494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the byte array to read from 1504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>Writer</code> to write to 1514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 1524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy(byte[] input, Writer output) 1544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 1554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira ByteArrayInputStream in = new ByteArrayInputStream(input); 1564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira copy(in, output); 1574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 1584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 1614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy and convert bytes from a <code>byte[]</code> to chars on a 1624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>Writer</code>, using the specified encoding. 1634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the byte array to read from 1644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>Writer</code> to write to 1654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param encoding The name of a supported character encoding. See the 1664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <a href="http://www.iana.org/assignments/character-sets">IANA 1674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Charset Registry</a> for a list of valid encoding types. 1684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 1694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy( 1714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira byte[] input, 1724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira Writer output, 1734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira String encoding) 1744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 1754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira ByteArrayInputStream in = new ByteArrayInputStream(input); 1764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira copy(in, output, encoding); 1774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 1784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 1814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // Core copy methods 1824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 1834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 1844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 1854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy bytes from an <code>InputStream</code> to an 1864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>OutputStream</code>. 1874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>InputStream</code> to read from 1884ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>OutputStream</code> to write to 1894ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @return the number of bytes copied 1904ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 1914ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 1924ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static int copy( 1934ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira InputStream input, 1944ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira OutputStream output) 1954ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 1964ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 1974ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira int count = 0; 1984ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira int n = 0; 1994ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira while (-1 != (n = input.read(buffer))) { 2004ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira output.write(buffer, 0, n); 2014ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira count += n; 2024ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2034ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return count; 2044ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2054ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2064ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2074ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // Reader -> Writer 2084ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2094ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 2114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy chars from a <code>Reader</code> to a <code>Writer</code>. 2124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>Reader</code> to read from 2134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>Writer</code> to write to 2144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @return the number of characters copied 2154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 2164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 2174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static int copy( 2184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira Reader input, 2194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira Writer output) 2204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 2214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira char[] buffer = new char[DEFAULT_BUFFER_SIZE]; 2224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira int count = 0; 2234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira int n = 0; 2244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira while (-1 != (n = input.read(buffer))) { 2254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira output.write(buffer, 0, n); 2264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira count += n; 2274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return count; 2294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // InputStream -> Writer 2334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 2364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy and convert bytes from an <code>InputStream</code> to chars on a 2374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>Writer</code>. 2384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The platform's default encoding is used for the byte-to-char conversion. 2394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>InputStream</code> to read from 2404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>Writer</code> to write to 2414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 2424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 2434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy( 2444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira InputStream input, 2454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira Writer output) 2464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 2474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira InputStreamReader in = new InputStreamReader(input); 2484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira copy(in, output); 2494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 2524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy and convert bytes from an <code>InputStream</code> to chars on a 2534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>Writer</code>, using the specified encoding. 2544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>InputStream</code> to read from 2554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>Writer</code> to write to 2564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param encoding The name of a supported character encoding. See the 2574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <a href="http://www.iana.org/assignments/character-sets">IANA 2584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Charset Registry</a> for a list of valid encoding types. 2594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 2604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 2614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy( 2624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira InputStream input, 2634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira Writer output, 2644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira String encoding) 2654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 2664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira InputStreamReader in = new InputStreamReader(input, encoding); 2674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira copy(in, output); 2684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // Reader -> OutputStream 2734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 2764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Serialize chars from a <code>Reader</code> to bytes on an 2774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>OutputStream</code>, and flush the <code>OutputStream</code>. 2784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>Reader</code> to read from 2794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>OutputStream</code> to write to 2804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 2814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 2824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy( 2834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira Reader input, 2844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira OutputStream output) 2854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 2864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira OutputStreamWriter out = new OutputStreamWriter(output); 2874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira copy(input, out); 2884ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // XXX Unless anyone is planning on rewriting OutputStreamWriter, we 2894ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // have to flush here. 2904ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira out.flush(); 2914ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 2924ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2934ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2944ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // String -> OutputStream 2954ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 2964ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 2974ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 2984ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Serialize chars from a <code>String</code> to bytes on an 2994ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <code>OutputStream</code>, and 3004ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * flush the <code>OutputStream</code>. 3014ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>String</code> to read from 3024ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>OutputStream</code> to write to 3034ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 3044ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 3054ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy( 3064ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira String input, 3074ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira OutputStream output) 3084ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 3094ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira StringReader in = new StringReader(input); 3104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira OutputStreamWriter out = new OutputStreamWriter(output); 3114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira copy(in, out); 3124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // XXX Unless anyone is planning on rewriting OutputStreamWriter, we 3134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // have to flush here. 3144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira out.flush(); 3154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 3164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 3174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 3184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // String -> Writer 3194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira // ---------------------------------------------------------------- 3204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 3214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira /** 3224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Copy chars from a <code>String</code> to a <code>Writer</code>. 3234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param input the <code>String</code> to read from 3244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @param output the <code>Writer</code> to write to 3254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @throws IOException In case of an I/O problem 3264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */ 3274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public static void copy(String input, Writer output) 3284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira throws IOException { 3294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira output.write(input); 3304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 3314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 3324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira} 333