三、Java NIO 通道(Channel)
所有文章
https://www.cnblogs.com/lay2017/p/12901123.html
正文
Java NIO中的通道(Channel)和我们熟悉的流(Stream)很相似,区别点在于:
1.Stream只能读或者写,但是Channel可以同时读写
2.Stream的读写是同步的,而Channel的读写是异步的
3.Channel总是和缓冲区(Buffer)打交道,从Channel读取数据到Buffer或者从Buffer写入数据到Channel,如图:
Channel的实现
以下包含了几个在java Nio软件包中比较重要的Channel实现:
1.FileChannel:从文件中读取数据的通道
2.DatagramChannel:通过UDP读取数据
3.SocketChannel:通过TCP读取数据
4.ServerSocketChannel:不直接读取数据,而是监听TCP连接的建立。当有TCP链接建立的时候,那么创建一个SocketChannel,从而通过TCP读取数据
Channel的示例代码
以下是一个很基础的示例代码,使用FileChannel从文件中读取数据到Buffer里
// 构建随机访问可读写的文件对象 RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); // 获取文件通道 FileChannel inChannel = aFile.getChannel(); // 分配缓冲区 ByteBuffer buf = ByteBuffer.allocate(48); // 将通道数据读入到缓冲区 int bytesRead = inChannel.read(buf); // 当数据不为空 while (bytesRead != -1) { // 翻转缓冲区,先limit=position,再position=0 buf.flip(); // 如果缓冲区还有剩余数据 while(buf.hasRemaining()){ // 获取并打印 System.out.print((char) buf.get()); } // 将position=0,limit=capacity buf.clear(); // 再次读入数据到缓冲区,进入下一个循环 bytesRead = inChannel.read(buf); } // 关闭文件对象 aFile.close();
代码比较简单,就是通道从文件读取数据,读入buffer再打印。但是这里涉及了一些buffer的操作,比如flip、clear,可能会让读者产生疑惑。后续文章会涉及