FileDocCategorySizeDatePackage
ChannelToWriter.javaAPI DocExample3018Sat Jan 24 10:44:28 GMT 2004je3.nio

ChannelToWriter

public class ChannelToWriter extends Object

Fields Summary
Constructors Summary
Methods Summary
public static voidcopy(java.nio.channels.ReadableByteChannel channel, java.io.Writer writer, java.nio.charset.Charset charset)
Read bytes from the specified channel, decode them using the specified Charset, and write the resulting characters to the specified writer

	// Get and configure the CharsetDecoder we'll use
	CharsetDecoder decoder = charset.newDecoder();
	decoder.onMalformedInput(CodingErrorAction.IGNORE);
	decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);

	// Get the buffers we'll use, and the backing array for the CharBuffer.
	ByteBuffer bytes = ByteBuffer.allocateDirect(2*1024);
	CharBuffer chars = CharBuffer.allocate(2*1024);
	char[] array = chars.array();

	while(channel.read(bytes) != -1) { // Read from channel until EOF
	    bytes.flip();                  // Switch to drain mode for decoding
	    // Decode the byte buffer into the char buffer.
	    // Pass false to indicate that we're not done.
	    decoder.decode(bytes, chars, false);

	    // Put the char buffer into drain mode, and write its contents
	    // to the Writer, reading them from the backing array.
	    chars.flip();               
	    writer.write(array, chars.position(), chars.remaining());  

	    // Discard all bytes we decoded, and put the byte buffer back into
	    // fill mode.  Since all characters were output, clear that buffer.
	    bytes.compact();            // Discard decoded bytes
	    chars.clear();              // Clear the character buffer
	}
	    
	// At this point there may still be some bytes in the buffer to decode
	// So put the buffer into drain mode call decode() a final time, and
	// finish with a flush().
	bytes.flip();
	decoder.decode(bytes, chars, true);  // True means final call
	decoder.flush(chars);                // Flush any buffered chars
	// Write these final chars (if any) to the writer.
	chars.flip();                           
	writer.write(array, chars.position(), chars.remaining());  
	writer.flush();
    
public static voidmain(java.lang.String[] args)

	FileChannel c = new FileInputStream(args[0]).getChannel();
	OutputStreamWriter w = new OutputStreamWriter(System.out);
	Charset utf8 = Charset.forName("UTF-8");
	ChannelToWriter.copy(c, w, utf8);
	c.close();
	w.close();