java基础篇之nio与aio
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础篇之nio与aio相关的知识,希望对你有一定的参考价值。
1.同步和异步
同步:指一个任务运行完以后接着运行下一个任务
异步:接到一个任务后开启一个新的线程运行此任务,基本不占用原线程时间
2.阻塞与非阻塞
阻塞:多个线程同时访问一份数据时,只有一个线程进行访问,其他处于等待状态
非阻塞:多个线程可以同时访问同一份数据
3.nio与io及aio区别
nio:同步非阻塞式
io:同步阻塞式
aio:异步非阻塞式
效率io<nio<aio
4.buffer缓冲区:进行相应的数据读写等操作
1)子类有bytebuffer,charbuffer,floatbuffer,doublebuffer,intbuffer,longbuffer,shortbuffer等,但是没有booleanbuffer(因为boolean只有true和false不好确定其位置)
2)buffer缓冲区的4个核心属性
capacity:容量,表示缓冲区中最大储存数据的容量
limit:界限,表示缓冲区中可以操作数据的大小(limit后的数据进行不能读写操作)
position:位置,表示缓冲区中正在操作数据的位置
mark:标记记录当前position的位置
3)buffer的方法:
capacity():返回capacity大小=等于设定值
clear():进行相应的重置,limit=capacity=设定值 position=0
flip(): position位置变为数据插入起点0,limit变为数据插入的末端,capacity不变,put后一般都会用到flip()
array():返回一个相应数组
hasRemaining():换回是否已经到达上界limit,一般与while配合使用
limit(int newLimit):设置上界,一般用于算取长度
position(int newPosition):设置position位置
remaining():返回从position位置到上界位置还剩元素的数目
reset():将position设定在mark()标记位置处,一般情况下reset与mak配合使用的
rewind():将position位置设为0,并且清除mark标记
isDirect():返回是否是直接缓冲区
isReadOnly():返回这个缓冲区是否只读
hasArray():此缓冲区是否返回的是一个可访问的数组
4)buffer子类之间的相互转换,as。。。,capacity会进行相应的字节长度变换
5)bytebuffer
获取对象的方法
Bytebuffer.allocate(int capacity):非直接缓冲区
Bytebuffer.allocateDirect(int capacity):直接缓冲区
Bytebuffer.wrap(byte[] array):非直接缓冲区
Bytebuffer.wrap(byte[] array, int offset, int length):非直接缓冲区
Bytebuffer常用方法:
get(byte[] dst):获取缓冲区数组内容
get(int index):获取指定位置的缓冲区内容
order():获取此缓冲区的字节顺序
put(byte[] src):缓冲区按数组放入数据
put(byte b):缓冲区按字节放入数据
put(int index, byte b):指定位置放入字节数据
6)一般使用步骤
创建buffer对象,定义初始容量
put放入数据
Flip()翻转
Get()获取数据
Clear()重置
5. channel通道:连接数据源的通道,程序不能直接访问channel中的数据,必须与bytebuffer进行相应的数据交互,才能访问其中的数据
1)接口中的方法
Close():通道的关闭
Isopen():返回通道是开启还是关闭
2)实现接口常用类
nio
FileChannel类;DatagramChannel类 ServerSocketChannel类 SocketChannel类
Aio
AsynchronousFileChannel类 AsynchronousServerSocketChannel类 AsynchronousSocketChannel类
3)nio
FileChannel类
常用获取对象的方法
Fileinputstream.getchannel()
Fileoutputstream.getchannel()
RandomAccessFile.getchannel()
Filechannel.open(Path path, OpenOption... options) (path:paths.get(String url),
openoption…可变参数
子类 StandardOpenOption枚举类型
常用值:
Append:添加在文件末尾
Create:如果文件不存在创建文件,存在就覆盖,此选项会忽略create_new选项
create_new:如果不存在就创建,如果存在就报错
write:写
read:读)
常用方法:
Force():强制将通道内的内容写入相应的存储设备上,对与系统崩溃时即时保存数据有用
Lock():获取通道的独占锁(独占锁:每次只可以一个线程访问,共享锁:并发访问共享资源,允许许可的多个线程同时访问,如semaphore)
transferTo(long position, long count, WritableByteChannel target):将一个文件写入另一个文件,与transferform类似
read
(
ByteBuffer
dst)
:
读取内容放入buffer缓冲区
read
(
ByteBuffer
[] dst)
:读取内容放入缓冲区数组,按先后顺序读(scatter)
read(ByteBuffer[] dsts, int offset, int length):读取从offset 开始,长度length数组的buffer并写入
size():返回文件的大小
truncate(long size):截取文件
write(ByteBuffer src):将buffer缓冲区的文件写入
write(ByteBuffer[] srcs):将buffer缓冲区数组的文件写入,按其顺序(gather)
write(ByteBuffer[] dsts, int offset, int length):读取从offset 开始,长度length数组的buffer并写入
一般使用步骤
创建对象
建立buffer缓存
将内容循环read读取至缓冲区
Flip()相应的翻转
Write相应的写入文件
Clear()相应的重置,重新利用缓冲区
进行相应的关闭
DatagramChannel类
常用获取对象的方法
DatagramChannel.open()
常用方法
bind(SocketAddress local):绑定端口
connect(SocketAddress remote):连接端口及地址
disconnect():断开连接
isConnected()判断是否已连接
receive(ByteBuffer dst):服务端接受缓冲区内容
send(ByteBuffer src, SocketAddress target):发送缓冲区数据到指定地址
register(Selector sel, int ops):向给定选择器注册通道,返回一个键值
configureBlocking(boolean block):调整阻塞模式 true阻塞模式,false非阻塞模式 使用选择器需要采用非阻塞模式
一般使用步骤
创建客户端对象
设定为直接缓存
创建缓冲区
循环read读取
Flip进行相应的翻转
将缓存区发送出去,输入相应的ip地址和端口
Clear相应的重置缓冲区
相应的关闭对象
服务端创建相应的对象
设定为直接缓存
绑定相应的端口
创建选择器轮询式检测就绪状态,其中进行相应的flip(),receive(buffer)及clear
移除迭代器
ServerSocketChannel类
常用获得对象的方法:
ServerSocketChannel.open()
常用方法:
bind(SocketAddress local):绑定端口
register(Selector sel, int ops):向给定选择器注册通道,返回一个键值
accept():接受缓冲区内容
configureBlocking(boolean block):调整阻塞模式 true阻塞模式,false非阻塞模式 使用选择器需要采用非阻塞模式
创建服务端对象
改为直接缓存
绑定端口
创建选择器并轮询式检测
循环进行相应的读写
移除迭代器
SocketChannel类
常用获取对象方法
SocketChannel.open()
常用方法
connect(SocketAddress remote):同上
isConnected():同上
read(ByteBuffer dst):同上
write(ByteBuffer src) :同上
write(ByteBuffer[] srcs) :同上
write(ByteBuffer[] srcs, int offset, int length) :同上
configureBlocking(boolean block) :同上
一般步骤
常见通道对象,并连接ip地址和端口
改为直接缓存
创建缓冲区对象
相应的循环 flip() write(buffer) clear
关闭通道对象
selector选择器
常用获取对象的方法
selector.open()
常用方法
select():换回已经准备就绪的缓冲数
selectedKeys():键集(selectedKey.op_connect:连接就绪 ,selectedKey.op_accept:接受就绪,selectedKey.op_read读就绪 ,selectedKey.op_write写就绪)
selectNow():现在没有准备就绪的就立马结束
select(long timeout):最多等待timeout没有就绪的就结束
close():关闭选择器
selectedKey
isReadable():是否读准备就绪
isWritable():是否准备好写入就绪
cancel():取消选择器注册
isAcceptable():接受是否准备就绪
isConnectable():连接是否准备就绪
pipe管道
sinkchannel 写操作
sourcechannel 读操作
其余基本类似
4)aio
AsynchronousFileChannel类
常用常见对象的方法
AsynchronousFileChannel.open()
AsynchronousFileChannel. open(AsynchronousChannelGroup group):绑定线程池,(线程池处理两件事情:处理io和派发competition)
常用方法
force(boolean metaData)
lock()
read(ByteBuffer dst, long position)
size()
truncate(long size)
write(ByteBuffer src, long position)
close()
AsynchronousServerSocketChannel类
常用常见对象方法:
AsynchronousServerSocketChannel.open()
AsynchronousServerSocketChannel.open(AsynchronousChannelGroup group)
常用方法:
accept()
bind(SocketAddress local)
AsynchronousSocketChannel类
常用获取对象的方法
AsynchronousSocketChannel. open()
AsynchronousSocketChannel. open(AsynchronousChannelGroup group)
常用方法
bind(SocketAddress local)
connect(SocketAddress remote)
read(ByteBuffer dst)
write(ByteBuffer src)
shutdownInput()
shutdownOutput()
以上是关于java基础篇之nio与aio的主要内容,如果未能解决你的问题,请参考以下文章