Java NIO系列教程(二) Channel
发布日期:2021-07-01 01:39:58
浏览次数:3
分类:技术文章
本文共 1025 字,大约阅读时间需要 3 分钟。
转载自
作者: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中的示例:
01 | RandomAccessFile aFile = new RandomAccessFile( "data/nio-data.txt" , "rw" ); |
02 | FileChannel inChannel = aFile.getChannel(); |
03 |
04 | ByteBuffer buf = ByteBuffer.allocate( 48 ); |
05 |
06 | int bytesRead = inChannel.read(buf); |
07 | while (bytesRead != - 1 ) { |
08 |
09 | System.out.println( "Read " + bytesRead); |
10 | buf.flip(); |
11 |
12 | while (buf.hasRemaining()){ |
13 | System.out.print(( char ) buf.get()); |
14 | } |
15 |
16 | buf.clear(); |
17 | bytesRead = inChannel.read(buf); |
18 | } |
19 | aFile.close(); |
注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。
转载地址:https://maokun.blog.csdn.net/article/details/80630688 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月12日 23时05分05秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
什么是Web 2.0?
2019-05-01
Junit执行及加载顺序分析(原创)
2019-05-01
ORACLE SQL性能优化系列(一)
2019-05-01
ORACLE SQL性能优化系列(二)
2019-05-01
处理正则表达式的java包:regexp
2019-05-01
正则表达式简介(微软)--4.正则表达式语法
2019-05-01
正则表达式简介(微软)--5.建立正则表达式
2019-05-01
正则表达式简介(微软)--6.优先权顺序
2019-05-01
算法-Hash+滑动窗口/按位编码-重复的DNA序列
2019-05-01
多用户与多租户的区别
2019-05-01
算法-滑动窗口-最小覆盖子串
2019-05-01
算法-图/DFS/BFS/并查集-岛屿数量
2019-05-01
算法-并查集
2019-05-01
常使用的Emacs命令
2019-05-01
现代UNIX系统有什么设计上的不足么
2019-05-01
Tilera多线程网络编程总结
2019-05-02
配置Mysql数据库支持远程连接等操作的步骤
2019-05-02
linux环境变量 export命令使用总结--重点
2019-05-02
GCC、头文件查找顺序总结
2019-05-02
linux Makefile总结
2019-05-02