package at.gv.egovernment.moa.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
/**
* Utility methods for streams.
*
* @author Patrick Peck
* @version $Id$
*/
public class StreamUtils {
/**
* Compare the contents of two InputStream
s.
*
* @param is1 The 1st InputStream
to compare.
* @param is2 The 2nd InputStream
to compare.
* @return boolean true
, if both streams contain the exactly the
* same content, false
otherwise.
* @throws IOException An error occurred reading one of the streams.
*/
public static boolean compareStreams(InputStream is1, InputStream is2)
throws IOException {
byte[] buf1 = new byte[256];
byte[] buf2 = new byte[256];
int length1;
int length2;
try {
while (true) {
length1 = is1.read(buf1);
length2 = is2.read(buf2);
if (length1 != length2) {
return false;
}
if (length1 <= 0) {
return true;
}
if (!compareBytes(buf1, buf2, length1)) {
return false;
}
}
} catch (IOException e) {
throw e;
} finally {
// close both streams
try {
is1.close();
is2.close();
} catch (IOException e) {
// ignore this
}
}
}
/**
* Compare two byte arrays, up to a given maximum length.
*
* @param b1 1st byte array to compare.
* @param b2 2nd byte array to compare.
* @param length The maximum number of bytes to compare.
* @return true
, if the byte arrays are equal, false
* otherwise.
*/
private static boolean compareBytes(byte[] b1, byte[] b2, int length) {
if (b1.length != b2.length) {
return false;
}
for (int i = 0; i < b1.length && i < length; i++) {
if (b1[i] != b2[i]) {
return false;
}
}
return true;
}
/**
* Reads a byte array from a stream.
* @param in The InputStream
to read.
* @return The bytes contained in the given InputStream
.
* @throws IOException on any exception thrown
*/
public static byte[] readStream(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while ((b = in.read()) >= 0)
out.write(b);
in.close();
return out.toByteArray();
}
/**
* Reads a String
from a stream, using given encoding.
* @param in The InputStream
to read.
* @param encoding The character encoding to use for converting the bytes
* of the InputStream
into a String
.
* @return The content of the given InputStream
converted into
* a String
.
* @throws IOException on any exception thrown
*/
public static String readStream(InputStream in, String encoding) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while ((b = in.read()) >= 0)
out.write(b);
in.close();
return out.toString(encoding);
}
/**
* Gets the stack trace of the Throwable
passed in as a string.
* @param t The Throwable
.
* @return a String representing the stack trace of the Throwable
.
*/
public static String getStackTraceAsString(Throwable t)
{
ByteArrayOutputStream stackTraceBIS = new ByteArrayOutputStream();
t.printStackTrace(new PrintStream(stackTraceBIS));
return new String(stackTraceBIS.toByteArray());
}
}