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()