注意:转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(二) Channel

Channel

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:

一、Channel的实现

这些是Java NIO中最重要的通道的实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。

SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

二、基本的 Channel 示例

下面是一个使用FileChannel读取数据到Buffer中的示例:

public class Channel1 {public static void main(String[] args) {try {RandomAccessFile raf = new RandomAccessFile("./.gitignore","rw");FileChannel channel = raf.getChannel();     //获取通道ByteBuffer bf = ByteBuffer.allocate(50);    //通过静态allocate方法创建一个缓冲区,容量为50byte[] bytes = new byte[]{};bytes = "123".getBytes();bf = ByteBuffer.wrap(bytes);                //通过静态wrap方法,byte数组生成缓冲区,缓冲区中保留了原数据while(bf.hasRemaining()){System.out.print((char) bf.get());}int bytesRead ;while ((bytesRead = channel.read(bf)) != -1) {      //将通道中的数据写入缓冲区,并判断通道中的数据是否到末尾System.out.println("Read " + bytesRead);bf.flip();                                      //反转缓冲区 实际上就是将position置为0 后续buffer详细介绍while(bf.hasRemaining()){                       //判断缓冲区中是否还有值System.out.print((char) bf.get());          //输出缓冲区中的值
                }bf.clear();                                     //清理缓冲区
            }raf.close();                                        //关闭RandomAccessFile} catch (IOException e) {e.printStackTrace();}}
}

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节

转载于:https://www.cnblogs.com/zhangxinly/p/6958570.html

JAVA-2NIO之Channel相关推荐

  1. Java NIO之Channel(通道)

    **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...

  2. Java NIO 之Channel

    定义 用于源节点和目标节点之间的连接.nio中负责缓冲区中数据传输,Channel本地并不存储数据,而是配合缓冲区进行数据传输.你可以把它理解成io中的流. 结构(java.nio.channels. ...

  3. JAVA NIO - Buffer Channel

    2019独角兽企业重金招聘Python工程师标准>>> Buffer和Channel是NIO中的基本对象,凡是涉及到I/O的操作都都会用到Buffer和Channel. Channe ...

  4. java之NIO(Channel,Buffer,Selector)

    java之NIO 1 什么是NIO Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API.NIO支持面向缓冲区的.基于通道的IO操作 ...

  5. fabric java sdk解析channel.queryTransactionByID(txId)方法的返回值

    解析区块链上具体某一个块的内容,官方java sdk已经给出了解析案例,具体解析过程也可参考QueryHandler#queryBlockChain. 但是如果要根据交易ID(txId)查找交易信息, ...

  6. 内存双通道与Java中的Channel

    双通道内存:指在北桥(又称之为MCH)芯片级里设计两个内存控制器,这两个内存控制器可相互独立工作,每个控制器控制一个内存通道,通过CPU可分别寻址.读取数据,从而使内存的带宽增加一倍,数据存取速度也相 ...

  7. java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取

    通道(Channel): 由java.nio.channels包定义的,Channel表示IO源与目标打开的连接,Channel类似于传统的"流",只不过Channel本身不能直接 ...

  8. Java NIO Channel

    Java NIO 通道(Channel) Java NIO的Channel和流(Streams)很相似,但是也有一些区别: Channel是双向的,你可以从Channel中读取,也可以向Channel ...

  9. Java NIO学习篇之通道Channel详解

    定义: Channel:通道,运输的介质,可以大致比喻成铁路的铁轨,连接着两个车站,而channel用于打开与IO设备的连接,比如磁盘,套接字等. 通道使用完需要关闭. 与传统IO的Stream比较: ...

  10. java文件读写之Channel策略

    概述 本篇博客向大家介绍的是如何运用java中的Channel进行文件读写,也就是说明如何通过Channel将字符串写到文件中,以及怎么把文件中的内容以字符串的形式读出来.具体地,我会介绍关于Chan ...

最新文章

  1. 你已经是个成熟的表格,该学会NLP了
  2. python单词意思-Python这个单词是什么含义??????????????
  3. linux系统如何安装其他包,Linux系统下如何安装软件包
  4. html dom节点源码,JavaScript操作HTML DOM节点的基础教程
  5. CRM Fiori应用 Appointment的close date字段
  6. 参加 JSConf China 2019 是怎样的体验?VS Code 和 TypeScript 都很火
  7. oracle 查看动态性能视图,oracle常用动态性能视图
  8. html中的各种协议,html 中使用 wtai 协议
  9. 网络中的那些事儿(一)之神奇的通讯
  10. Excel不好吗?为什么非要用Python做数据分析
  11. loadrunner11中文版破解文档+录制脚本(图/文)
  12. 如何查看Python源代码
  13. 毕业设计之---基于java web的停车管理系统
  14. 预充电电路工作原理_电动汽车电控系统预充电原理
  15. PicGo配置阿里云OSS
  16. 全国天气预报信息数据接口 API
  17. 嗨,程序员,你知道高级工程师用的搜索引擎吗?
  18. PHP——get和post请求他人接口
  19. java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署
  20. vm虚拟机装2019最新kali系统

热门文章

  1. (四)maven之查找jar包坐标,选择jar包版本
  2. 细说Nginx配置文件
  3. iPhone开发过程中调试多次Release问题 message sent to deallocated
  4. SSH框架中不为人知的细节(一)
  5. MongoDB实战(7)索引与性能
  6. 75的写的自己情感经历(转贴自天涯社区)
  7. arcgis server发布地图服务中文标注不能显示
  8. RabbitMQ—常见报错
  9. Python 把较长的一行代码分成多行的技巧
  10. RPi 树莓派 DSI 接口研究 MIPI raspberry pi