1、Java NIO 的通道类似流,但又有些不同:
既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
通道可以异步地读写。
通道中的数据总是要先读到一个 Buffer,或者总是要从一个 Buffer 中写入。
2、Channel 的实现
这些是 Java NIO 中最重要的通道的实现:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
FileChannel 从文件中读写数据。
DatagramChannel 能通过 UDP 读写网络中的数据。
SocketChannel 能通过 TCP 读写网络中的数据。
ServerSocketChannel 可以监听新进来的 TCP 连接,像 Web 服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
3、基本Channel示例:
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/** * nio channel 读取数据到buffer示例 * Created by 321695 on 2016/11/8. */ public class FileChannelTest { public static void main( String [] args) { RandomAccessFile randomAccessFile = null; try { //实例化randomAccessFile randomAccessFile = new RandomAccessFile( "E:/Dubbox/dubbo/nio-demo/src/main/resources/linux.txt" , "rw" ); //获取文件传输通道实例 FileChannel fileChannel = randomAccessFile.getChannel(); //创建一个容量为48字节的buffer ByteBuffer buffer = ByteBuffer.allocate( 48 ); //读取数据到buffer中 int bytesRead = fileChannel.read(buffer); while (bytesRead != - 1 ) { System.out.println( "Read" + bytesRead); //反转buffer buffer.flip(); //若buffer中还有元素,打印出来 while (buffer.hasRemaining()) { System.out.print(( char ) buffer.get()); } //清空buffer buffer.clear(); //继续处理未完成数据 bytesRead = fileChannel.read(buffer); } //文件操作对象关闭 randomAccessFile.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |