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 ...
随机推荐
- C指针和数组
一.指针 指针就是地址,指针变量是用来存放地址的变量,把谁的地址存放在指针变量中,就说此指针变量指向谁. 二.数组 1.一维数组 一维数组名代表数组首元素的地址,因此 *a=a[0]; &:取 ...
- ASP.NET Core 编码、web编码、网页编码 System.Text.Encodings.Web
System.Text.Encodings.Web 空间包含表示 Web 编码器的基类.表示 HTML.JavaScript 和 Url 字符编码的子类,以及表示仅允许编码特定字符.字符范围或码位的筛 ...
- perceptron感知机 mtalab
data=load('data.txt'); x=[data(:,1),data(:,2)]; y=data(:,3); k=length(y); %绘制散点图 for j=1:k if y(j)== ...
- mysql 基础学习1
安装得方法有很多,这里就不详细介绍了. 进入 mysql 控制台 mysql -uroot -p 查看 有哪些库 show databases; 1.创建一个库 create database tes ...
- [EffectiveC++]item22:Declare data members private
将成员变量隐藏在函数接口的背后,可以为“所有可能的实现”提供弹性, 假设我们有一个public成员变量,而我们最终取消了它,多少代码可能会被破坏呢?那是一个不可知的大量. protected成员变量就 ...
- SQL简单基础(1)
对于SQL不再做过多的介绍,毕竟作为一个初学者对于SQL(结构化查询语言)也好,关系型数据库也好理解都并不是很深,只知道一些基本的概念. 本系列旨在介绍一些简单开发中用得上的SQL语句以及其使用方法, ...
- centos虚拟机安装,配置静态ip可以访问网络
centos安装过程中需要注意几个问题 1.选择安装的软件 默认选择的是mininal,应该选择GNEME Desktop 安装的过程中可以设置network 配置linux网络命令 具体配置 退出键 ...
- springMVC <mvc:interceptors>拦截器的使用
首先在springMVC.xml配置如下代码 <!-- 拦截器 --> <mvc:interceptors> <bean class="com.base.Acc ...
- 【[SDOI2013]泉】
\(hash\)+容斥 但是看到这个令人愉快的数据范围还是直接枚举子集吧 首先我们发现\(6\)这个东西简直是小的可怜,复杂度里肯定有\(2^6\)的 于是我们可以直接先枚举子集,把所有状态的对应相等 ...
- MyBatis(2)-全局配置文件
本文的代码是在MyBatis(1)-简单入门基础之上进行学习的,如有不懂请先看此博文MyBatis(1)-简单入门! 1)配置文件的安装 --->在联网的情况下,点击去下载http://myba ...