Lately I've faced a simple problem: I needed to read all bytes from the InputStream. I didn't know type of the InputStream, so, I've spent more then two hours solving this problem without any success. I didn't want to read each byte from the stream. All evening I could think only about this problem. Solution turned to be very simple! I found a sample in the JDK installation directory($JAVA_HOME/sample/nio/). JDK 1.5(and higher) is a good API to work with streams over channels. The source code to read all bytes from the InputStream is rather simple:
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.Reader;
- import java.nio.ByteBuffer;
- import java.nio.channels.Channels;
- import java.nio.channels.ReadableByteChannel;
- /**
- * @author Pokidov.Dmitry
- * Date: 13.04.2009
- */
- public class IOHelper {
- /*Block size that we want to read in one time.*/
- private static final int READ_BLOCK = 8192;
- /*
- * Read all from stream, using nio.
- * @param is source stream.
- * @return result byte array that read from source
- * @throws IOException by {@code Channel.read()}
- */
- public static byte[] readToEnd(InputStream is) throws IOException {
- //create channel for input stream
- ReadableByteChannel bc = Channels.newChannel(is);
- ByteBuffer bb = ByteBuffer.allocate(READ_BLOCK);
- while (bc.read(bb) != -1) {
- bb = resizeBuffer(bb); //get new buffer for read
- }
- byte[] result = new byte[bb.position()];
- bb.position(0);
- bb.get(result);
- return result;
- }
- private static ByteBuffer resizeBuffer(ByteBuffer in) {
- ByteBuffer result = in;
- if (in.remaining() < READ_BLOCK) {
- //create new buffer
- result = ByteBuffer.allocate(in.capacity() * 2);
- //set limit to current position in buffer and set position to zero.
- in.flip();
- //put original buffer to new buffer
- result.put(in);
- }
- return result;
- }
Also I found an interesting book in which you can read about the nio package: get it here
Комментариев нет:
Отправить комментарий