nl.siegmann.epublib.util.IOUtil Maven / Gradle / Ivy
package nl.siegmann.epublib.util;
import java.io.*;
/**
* Most of the functions herein are re-implementations of the ones in apache io IOUtils.
* The reason for re-implementing this is that the functions are fairly simple and using my own implementation saves the inclusion of a 200Kb jar file.
*/
public class IOUtil {
public static final int IO_COPY_BUFFER_SIZE = 1024 * 4;
/**
* Gets the contents of the Reader as a byte[], with the given character encoding.
*
* @param in
* @param encoding
* @return the contents of the Reader as a byte[], with the given character encoding.
* @throws IOException
*/
public static byte[] toByteArray(Reader in, String encoding) throws IOException {
StringWriter out = new StringWriter();
copy(in, out);
out.flush();
return out.toString().getBytes(encoding);
}
/**
* Returns the contents of the InputStream as a byte[]
*
* @param in
* @return the contents of the InputStream as a byte[]
* @throws IOException
*/
public static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream();
copy(in, result);
result.flush();
return result.toByteArray();
}
/**
* Reads data from the InputStream, using the specified buffer size.
*
* This is meant for situations where memory is tight, since
* it prevents buffer expansion.
*
* @param in the stream to read data from
* @param size the size of the array to create
* @return the array, or null
* @throws IOException
*/
public static byte[] toByteArray( InputStream in, int size ) throws IOException {
try {
ByteArrayOutputStream result;
if ( size > 0 ) {
result = new ByteArrayOutputStream(size);
} else {
result = new ByteArrayOutputStream();
}
copy(in, result);
result.flush();
return result.toByteArray();
} catch ( OutOfMemoryError error ) {
//Return null so it gets loaded lazily.
return null;
}
}
/**
* if totalNrRead < 0 then totalNrRead is returned, if (nrRead + totalNrRead) < Integer.MAX_VALUE then nrRead + totalNrRead is returned, -1 otherwise.
* @param nrRead
* @param totalNrNread
* @return if totalNrRead < 0 then totalNrRead is returned, if (nrRead + totalNrRead) < Integer.MAX_VALUE then nrRead + totalNrRead is returned, -1 otherwise.
*/
protected static int calcNewNrReadSize(int nrRead, int totalNrNread) {
if (totalNrNread < 0) {
return totalNrNread;
}
if (totalNrNread > (Integer.MAX_VALUE - nrRead)) {
return -1;
} else {
return (totalNrNread + nrRead);
}
}
/**
* Copies the contents of the InputStream to the OutputStream.
*
* @param in
* @param out
* @return the nr of bytes read, or -1 if the amount > Integer.MAX_VALUE
* @throws IOException
*/
public static int copy(InputStream in, OutputStream out)
throws IOException {
byte[] buffer = new byte[IO_COPY_BUFFER_SIZE];
int readSize = -1;
int result = 0;
while ((readSize = in.read(buffer)) >= 0) {
out.write(buffer, 0, readSize);
result = calcNewNrReadSize(readSize, result);
}
out.flush();
return result;
}
/**
* Copies the contents of the Reader to the Writer.
*
* @param in
* @param out
* @return the nr of characters read, or -1 if the amount > Integer.MAX_VALUE
* @throws IOException
*/
public static int copy(Reader in, Writer out) throws IOException {
char[] buffer = new char[IO_COPY_BUFFER_SIZE];
int readSize = -1;
int result = 0;
while ((readSize = in.read(buffer)) >= 0) {
out.write(buffer, 0, readSize);
result = calcNewNrReadSize(readSize, result);
}
out.flush();
return result;
}
}