blob: f479043bf4503e5fd5042d0bbaa49fbbc535e47e [file] [log] [blame]
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.io;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import org.apache.commons.io.output.ByteArrayOutputStream;
/**
* General IO Stream manipulation.
* <p>
* This class provides static utility methods for input/output operations.
* <p>
* The closeQuietly methods are expected to be used when an IOException
* would be meaningless. This is usually when in a catch block for an
* IOException.
* <p>
* The toString and toByteArray methods all rely on CopyUtils.copy
* methods in the current implementation.
*
* <p>Origin of code: Apache Avalon (Excalibur)</p>
*
* @author Peter Donald
* @author Jeff Turner
* @author Stephen Colebourne
* @version CVS $Revision: 1.17 $ $Date: 2004/07/31 09:52:09 $
*/
public class IOUtils {
/**
* Instances should NOT be constructed in standard programming.
*/
public IOUtils() {
}
//-----------------------------------------------------------------------
/**
* Unconditionally close an <code>Reader</code>.
* <p>
* Equivalent to {@link Reader#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param input the Reader to close, may be null or already closed
*/
public static void closeQuietly(Reader input) {
try {
if (input != null) {
input.close();
}
} catch (IOException ioe) {
// ignore
}
}
/**
* Unconditionally close a <code>Writer</code>.
* <p>
* Equivalent to {@link Writer#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param output the Writer to close, may be null or already closed
*/
public static void closeQuietly(Writer output) {
try {
if (output != null) {
output.close();
}
} catch (IOException ioe) {
// ignore
}
}
/**
* Unconditionally close an <code>InputStream</code>.
* <p>
* Equivalent to {@link InputStream#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param input the InputStream to close, may be null or already closed
*/
public static void closeQuietly(InputStream input) {
try {
if (input != null) {
input.close();
}
} catch (IOException ioe) {
// ignore
}
}
/**
* Unconditionally close an <code>OutputStream</code>.
* <p>
* Equivalent to {@link OutputStream#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param input the OutputStream to close, may be null or already closed
*/
public static void closeQuietly( OutputStream output ) {
try {
if (output != null) {
output.close();
}
} catch (IOException ioe) {
// ignore
}
}
// toByteArray
//-----------------------------------------------------------------------
/**
* Get the contents of an <code>InputStream</code> as a <code>byte[]</code>.
*
* @param input the <code>InputStream</code> to read from
* @return the requested byte array
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
CopyUtils.copy(input, output);
return output.toByteArray();
}
/**
* Get the contents of a <code>Reader</code> as a <code>byte[]</code>
* using the default character encoding of the platform.
*
* @param input the <code>Reader</code> to read from
* @return the requested byte array
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static byte[] toByteArray(Reader input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
CopyUtils.copy(input, output);
return output.toByteArray();
}
/**
* Get the contents of a <code>Reader</code> as a <code>byte[]</code>
* using the specified character encoding.
* <p>
* Character encoding names can be found at
* <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
*
* @param input the <code>Reader</code> to read from
* @param encoding the encoding to use, null means platform default
* @return the requested byte array
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static byte[] toByteArray(Reader input, String encoding) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
CopyUtils.copy(input, output, encoding);
return output.toByteArray();
}
/**
* Get the contents of a <code>String</code> as a <code>byte[]</code>
* using the default character encoding of the platform.
* <p>
* This is the same as {@link String#getBytes()}.
*
* @param input the <code>String</code> to convert
* @return the requested byte array
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
* (never happens, but can't remove due to backwards compatibility)
*/
public static byte[] toByteArray(String input) throws IOException {
return input.getBytes();
}
/**
* Get the contents of a <code>String</code> as a <code>byte[]</code>
* using the specified character encoding.
* <p>
* This is based on {@link String#getBytes(String)}.
* Character encoding names can be found at
* <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
*
* @param input the <code>String</code> to convert
* @param encoding the encoding to use, null means platform default
* @return the requested byte array
* @throws NullPointerException if the input is null
* @throws UnsupportedEncodingException if the named charset is not supported
*/
public static byte[] toByteArray(String input, String encoding) throws UnsupportedEncodingException {
if (encoding == null) {
return input.getBytes();
}
return input.getBytes(encoding);
}
// toString
//-----------------------------------------------------------------------
/**
* Get the contents of an <code>InputStream</code> as a String
* using the default character encoding of the platform.
*
* @param input the <code>InputStream</code> to read from
* @return the requested String
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static String toString(InputStream input) throws IOException {
StringWriter sw = new StringWriter();
CopyUtils.copy(input, sw);
return sw.toString();
}
/**
* Get the contents of an <code>InputStream</code> as a String
* using the specified character encoding.
* <p>
* Character encoding names can be found at
* <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
*
* @param input the <code>InputStream</code> to read from
* @param encoding the encoding to use, null means platform default
* @return the requested String
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static String toString(InputStream input, String encoding) throws IOException {
StringWriter sw = new StringWriter();
CopyUtils.copy(input, sw, encoding);
return sw.toString();
}
/**
* Get the contents of a <code>Reader</code> as a String.
*
* @param input the <code>Reader</code> to read from
* @return the requested String
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static String toString(Reader input) throws IOException {
StringWriter sw = new StringWriter();
CopyUtils.copy(input, sw);
return sw.toString();
}
/**
* Get the contents of a <code>byte[]</code> as a String
* using the default character encoding of the platform.
*
* @param input the byte array to read from
* @return the requested String
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static String toString(byte[] input) throws IOException {
StringWriter sw = new StringWriter();
CopyUtils.copy(input, sw);
return sw.toString();
}
/**
* Get the contents of a <code>byte[]</code> as a String
* using the specified character encoding.
* <p>
* Character encoding names can be found at
* <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
*
* @param input the byte array to read from
* @param encoding the encoding to use, null means platform default
* @return the requested String
* @throws NullPointerException if the input is null
* @throws IOException if an I/O error occurs
*/
public static String toString(byte[] input, String encoding) throws IOException {
StringWriter sw = new StringWriter();
CopyUtils.copy(input, sw, encoding);
return sw.toString();
}
//-----------------------------------------------------------------------
/**
* Compare the contents of two Streams to determine if they are equal or not.
*
* @param input1 the first stream
* @param input2 the second stream
* @return true if the content of the streams are equal or they both don't exist, false otherwise
* @throws NullPointerException if either input is null
* @throws IOException if an I/O error occurs
*/
public static boolean contentEquals(InputStream input1, InputStream input2) throws IOException {
InputStream bufferedInput1 = new BufferedInputStream(input1);
InputStream bufferedInput2 = new BufferedInputStream(input2);
int ch = bufferedInput1.read();
while (-1 != ch) {
int ch2 = bufferedInput2.read();
if (ch != ch2) {
return false;
}
ch = bufferedInput1.read();
}
int ch2 = bufferedInput2.read();
if (-1 != ch2) {
return false;
} else {
return true;
}
}
}