java NIO 之 Channel
java NIO和流类似,但还是有所区别
- 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的
- 通道可以异步地读写
- 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入
从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:
Channel的实现
- FileChannel:从文件中读写数据。
- DatagramChannel:能通过UDP读写网络中的数据。
- SocketChannel:能通过TCP读写网络中的数据。
- ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
代码例子
package com.xx.nio; import java.io.File; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; public class ChannelTest { public static void main(String[] args) throws Exception { String path = ChannelTest.class.getResource("/").getPath(); FileInputStream fis = new FileInputStream(new File(path + "nio-test.txt")); FileChannel channel = fis.getChannel(); /* * Java.nio.charset.Charset处理了字符转换问题。 * 它通过构造CharsetEncoder和CharsetDecoder将字符序列转换成字节和逆转换。 */ Charset charset = Charset.forName("UTF-8"); CharsetDecoder decoder = charset.newDecoder(); ByteBuffer buffer = ByteBuffer.allocate(128); CharBuffer charBuffer = CharBuffer.allocate(128); int i = channel.read(buffer); while(i != -1){ buffer.flip(); // 切换到读模式 decoder.decode(buffer, charBuffer, false); charBuffer.flip(); // 切换到读模式 // 判断缓冲区中还有没有内容 while(charBuffer.hasRemaining()){ char c = charBuffer.get(); System.out.print(c); } charBuffer.clear(); buffer.clear(); i = channel.read(buffer); } channel.close(); fis.close(); } }