当前位置: 首页 > news >正文

Java NIO系列教程(二) Channel

原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一

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

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

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

 

Channel的实现

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

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel 从文件中读写数据。

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

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

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

基本的 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) {

System.out.println("Read " + bytesRead);
buf.flip();

while(buf.hasRemaining()){
System.out.print((char) buf.get());
}

buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();

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

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

转载于:https://www.cnblogs.com/dassmeta/p/5328731.html

相关文章:

  • Exception: 找不到或无法加载已注册的 .Net Framework Data Provider。
  • Ubuntu中vim添加lua支持
  • 《转载》化繁为简 如何向老婆解释MapReduce?
  • 获取AX的窗口所有控件的lableID及内容
  • 大数乘法(C语言实现)
  • Android IOS WebRTC 音视频开发总结(六七)-- 在线教育虽火要做好其实不容易
  • idea
  • git fetch 拉取而不合并
  • ZFS ARC L2ARC zfs-$ver/module/zfs/arc.c
  • Java 8新的时间日期库的20个使用示例
  • [翻译]Axure-Page Properties-原型设计工具Axure学习-第1.2节
  • jquery--递增--年份的选择
  • 并发数据结构-1.4 池
  • [TestLink]搭建指南(ubuntu)
  • iOS版本、iPhone版本、Xcode版本比对
  • hexo+github搭建个人博客
  • [数据结构]链表的实现在PHP中
  • 【译】理解JavaScript:new 关键字
  • golang 发送GET和POST示例
  • iOS编译提示和导航提示
  • Js基础知识(一) - 变量
  • JWT究竟是什么呢?
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 将回调地狱按在地上摩擦的Promise
  • 如何优雅地使用 Sublime Text
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 数组大概知多少
  • 携程小程序初体验
  • 一个JAVA程序员成长之路分享
  • ​520就是要宠粉,你的心头书我买单
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #100天计划# 2013年9月29日
  • (06)Hive——正则表达式
  • (1)(1.11) SiK Radio v2(一)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++20) consteval立即函数
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (篇九)MySQL常用内置函数
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • ./configure,make,make install的作用
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/C# 使用反射注册事件
  • .NET值类型变量“活”在哪?
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [Android]如何调试Native memory crash issue
  • [Avalon] Avalon中的Conditional Formatting.
  • [C++] new和delete
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [CSS]CSS 字体属性