Many times I was asked how to copy fast and simple an input stream to an output stream. I have found a nice solution on koders.com . A programmer named Mr. Hitchens has contributed this code.
Here are my utility method which makes the real fast copy stuff:
public final class ChannelTools {
public static void fastChannelCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException {
final ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024);
while (src.read(buffer) != -1) {
// prepare the buffer to be drained
buffer.flip();
// write to the channel, may block
dest.write(buffer);
// If partial transfer, shift remainder down
// If buffer is empty, same as doing clear()
buffer.compact();
}
// EOF will leave buffer in fill state
buffer.flip();
// make sure the buffer is fully drained.
while (buffer.hasRemaining()) {
dest.write(buffer);
}
}
}
And how you can use this method to copy an input stream into an output stream? Here comes the answer:
// allocate the stream ... only for example final InputStream input = new FileInputStream(inputFile); final OutputStream output = new FileOutputStream(outputFile); // get an channel from the stream final ReadableByteChannel inputChannel = Channels.newChannel(input); final WriteableByteChannel outputChannel = Channels.newChannel(output); // copy the channels ChannelTools.fastChannelCopy(inputChannel, outputChannel); // closing the channels inputChannel.close(); outputChannel.close()