您的位置:首页 > 编程语言 > Java开发

java NIO详解

2016-07-18 14:35 274 查看

概念

1、java 在1.4版本 引入了新的IO流API,替代了标准IO API

2、区别:

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之间的数据才会被写入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nio