java NIO详解
2016-07-18 14:35
274 查看
概念
1、java 在1.4版本 引入了新的IO流API,替代了标准IO API2、区别:
IO:基于字节流和字符流进行操作
NIO:基于通道channel和缓冲区buffer进行操作
3、结构成分:
channel buffer selectors
4、原理:
输入输出通道 和 输入输出流
a: 输入通道和输入流实现数据文件以流(字节流/字符流)形式封装
b: 输出通道和输出流实现流生成文件
c: 输入输出流是直接操作数据,通道会将数据缓存到缓冲区
FileInputStream fileInputStream = new FileInputStream("D://file1.txt"); //输入通道 FileChannel inChannel = fileInputStream.getChannel(); //缓冲区 设置大小 ByteBuffer buffer = ByteBuffer.allocate(48); //遍历输入通道 数据读取缓存到 int index = 0; while((index = inChannel.read(buffer)) != -1){ buffer.flip(); //清空读取的缓冲区 buffer.clear(); } //输出 将数据生成文件 FileOutputStream fileOutputStream = new FileOutputStream("D://lishuqing.txt"); FileChannel outChannel = fileOutputStream.getChannel(); outChannel.write(buffer); //流关闭 fileInputStream.close(); inChannel.close(); fileOutputStream.close(); outChannel.close();
buffer
1定义:本质上是一块可以写入数据,然后从中读取数据的内存,这块内存封装成NIO buffer对象 2过程: a、写入数据到buffer b、调用flip方法 将buffer从写模式切换成读模式 将输入读取到buffer中,数据会放到缓冲区未读数据的后面 c、从buffer中读取数据 d、调用clear方法,读取完所有数据,清空缓冲区,让它可以再次写入 3类型: byteBuffer MappedByteBuffer charBuffer doubleBuffer floatBuffer intBuffer longBUffer shortBuffer 不同的数据类型,通过基本类型来操作缓冲区 4实现: inChannel.read(buffer)或通过put方法写入到buffer中
channel
1、既可以从通道中读取数据,又可以写数据到通道,但流的读写通常都是单向 2、通道可以异步地读写 3、通道中的数据总是要先读到一个buffer,或者总是要从一个buffer中写入
FileChannel:从文件中读写数据
DatagramChannel:通过UDP读写网络中的数据
SocketChannel:能通过TCP读写网络中数据
serverSocketChannel:可以监听新进来的TCP连接,像web服务器那样,对每个新进来的连接都会创建一个socketChannel
selector
1、允许单线程处理多个channel 2、先向selector注册channel,才能调用select()方法,这个方法会一直阻塞到某个注册的通道有事件就绪,方法返回,线程才能处理这些事件
通道之间输出传输
FileInputStream fileInputStream = new FileInputStream("D://file1.txt"); //输入通道 FileChannel inChannel = fileInputStream.getChannel(); //遍历输入通道 数据读取缓存到 //输出 将数据生成文件 FileOutputStream fileOutputStream = new FileOutputStream("D://lishuqing.txt"); FileChannel outChannel = fileOutputStream.getChannel(); inChannel.transferTo(0, inChannel.size(), outChannel); outChannel.transferFrom(inChannel, 0, inChannel.size()); //流关闭 fileInputStream.close(); inChannel.close(); fileOutputStream.close(); outChannel.close();
A.transferTo(position,size,B) 从A文件读取数据向目标B文件中写入数据 position:源文件开始读取的位置 size:从偏移量开始读取的长度 A.transferFrom(B,position,size) 从B文件读取数据向A目标文件中写入数据
scatter/gather
分散scatter:从channel中读取是指在读取操作时将读取的数据写入到多个buffer中,因此channel将从channel中读取的数据分散到多个buffer中
//消息头 ByteBuffer headBuffer = ByteBuffer.allocate(128); //正文 ByteBuffer bodyBuffer = ByteBuffer.allocate(1024); ByteBuffer[] buffers = {headBuffer,bodyBuffer}; inChannel.read(buffers); outChannel.write(buffers);
read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写 write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入
相关文章推荐
- spymemcached源码中Reactor模式分析
- Java IO与NIO的一些文件拷贝测试
- Java NIO工作原理的全面分析
- Java Socket编程实例(五)- NIO UDP实践
- java的nio的使用示例分享
- Java NIO和IO的区别
- Java Socket编程实例(四)- NIO TCP实践
- java十分钟速懂知识点——NIO
- Java IO/NIO学习总结
- 使用Nginx代理thrift NIO实现SSL链路加密
- (IO密集型事务)同步,异步与CPU使用率关系
- 再说异步调用和NIO
- Java NIO:NIO概述
- io、nio、 aio
- javaIO之NIO
- 对java和c的io速度的进一步比较
- 理解Java NIO [转]
- Java BIO、NIO、AIO 比较
- BIO,NIO,AIO基础解析(java)