Java NIO (1)
Java NIO (1)
看了下java核心技术这本书 关于nio的部分介绍比较少,而且如果自己写服务器的话nio用的还是比较多,整理一下nio的资料
java中nio主要是三个组件
- Buffers
- Channels
- Selectors
Buffer可以理解为缓冲区,NIO中的Buffer实现很多,一般常用的就是ByteBuffer
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
ByteBuffer mapedBuffer = ByteBuffer.allocateDirect(1024);
一般情况下我们不必直接操作byteBuffer,都是用一个Channel来操作
FileChannel fileChannel = FileChannel.open(path);
int hadread = fileChannel.read(byteBuffer);
调用flip切换为读写模式
int hadread;
while ((hadread=fileChannel.read(byteBuffer))>0){
byteBuffer.flip();
byte[] bytes = new byte[1024];
System.out.println(hadread);
byteBuffer.get(bytes,0,hadread);
for (int i = 0; i < hadread; i++) {
System.out.println(bytes[i]);
}
byteBuffer.flip();
}
如果遇到了网络编程,我们可能会需要类似于linux select epoll的功能,java nio已经为我们提供了
一般情况下,我们使用单个线程处理多个Channels,因为如果线程过多,可能造成频繁的上下文切换导致开销过高(跟太频繁系统调用一个道理)
selector就为我们提供了这样的功能
不过selector只能跟SocketChannel一起使用,因为Channel必须处于非阻塞模式下
FileChannel没有configureBlocking这个方法
Selector selector = Selector.open();
SocketChannel channel = server.accept();
// 有新的连接并不代表这个通道就有数据,
// 这里将这个新的 SocketChannel 注册到 Selector,监听 OP_READ 事件,等待数据
channel.configureBlocking(false);
//注册给某个selector
SelectionKey key = channel.register(selector,
Selectionkey.OP_READ);
SelectionKey key;
Channel channel = key.channel();
Selector selector = key.selector();
注册完之后,就可以像linux那样select
//调用select
// @return The number of keys, possibly zero,
// whose ready-operation sets were updated
int readys = selector.select();
//获取就绪事件的集合
Set selectedKeys = selector.selectedKeys();
//这里返回的是所有就绪事件,比如说可以读,可以写,可以连接
//完整实例:
Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if(key.isAcceptable()) {
// a connection was accepted by a ServerSocketChannel.
} else if (key.isConnectable()) {
// a connection was established with a remote server.
} else if (key.isReadable()) {
// a channel is ready for reading
} else if (key.isWritable()) {
// a channel is ready for writing
}
keyIterator.remove();
}
}
这个网站里面nio写的很好
还有这个
http://www.importnew.com/28021.html
Java NIO (1)的更多相关文章
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- 支撑Java NIO 与 NodeJS的底层技术
支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...
- JAVA NIO学习笔记1 - 架构简介
最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...
- Java NIO概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...
- JAVA NIO Socket通道
DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...
- JAVA NIO FileChannel 内存映射文件
文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...
- java nio系列文章
java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍 (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...
- Java NIO (转)
Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- Java - NIO
java.nio:NIO-2: NIO 面向流的IO体系一次只能处理一个或多个字节/字符,直至读取所有字节/符,且流中的数据不能前后移动.效率低,当数据源中没有数据时会阻塞线程.Java-4提供的新A ...
随机推荐
- Mysql学习---Python操作Mysql 1231
安装PyMysql 安装PyMysql:Py3默认自带pip3安装,Py2默认无pip命令 cmd进入PyCharm的安装目录完成安装 pip3 install pymysql 安装完成的位置:E:\ ...
- 团队作业—预则立&&他山之石(人月神教)
1.团队任务 GitHub issues 1.2 团队计划 2.访谈任务 2.1采访对象 采访团队:龙威零式 采访时间:2017.10.23 采访形式:微信群 2.2采访内容 问:你们选题的时候有哪些 ...
- 4、Node.js REPL(交互式解释器)
Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并 ...
- SGU---462 Electrician 最大生成树
题目链接: https://cn.vjudge.net/problem/SGU-462 题目大意: 有N条电线需要接入电网,第i条电线计划连接ai和bi两个地点,电线有两个属性:ri(电线稳定度)和c ...
- IntelliJ IDEA 与Eclipse Link with Editor等价功能设置
Link With Editor是Eclipse内置功能中十分小巧,但却异常实用的一个功能. 这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource Explo ...
- c++抽象类,纯虚函数
- 报错 Filtered offsite request
用scrapy框架迭代爬取时报错 scrapy日志: 在 setting.py 文件中 设置 日志 记录等级 LOG_LEVEL= 'DEBUG' LOG_FILE ='log.txt' 观察 scr ...
- Dubbo特性
dubbo.properties Dubbo 将自动加载 classpath 根目录下的dubbo.properties,可以通过JVM启动参数 -Ddubbo.properties.file=xxx ...
- matlab中的unique函数详解
https://blog.csdn.net/sinat_40282753/article/details/78373532
- No.4 - 3D 空间的卡片翻转动效
参考 ①张鑫旭http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/ ...