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的主要内容,如果未能解决你的问题,请参考以下文章

初理解Java中的BIO,NIO,AIO

也谈BIO | NIO | AIO (Java版--转)

Java BIO与NIO以及AIO分析

Java IO 基础

基础 | BIONIO与AIO

Java进阶知识点:服务端高并发的基石 - NIO与Reactor AIO与Proactor