Java I/O机制总结

Java常见的I/O机制都是通过同步的方式实现的,其中又分BIO(阻塞)和NIO(非阻塞),传统的BIO方式一次(一个线程)只能同时处理一个I/O操作,对于需要同时处理多个客户端的请求,需要建立对应数目的线程数,对于系统资源是一个很大的开销;而在NIO的机制中,将所有的I/O操作交由Selector来统一调度,当某个通道(Channel)有可读/写数据时,由Selector来完成通道上的数据传输,在这种情况下,只需要一个线程就可以控制所有的I/O操作;还有一种应用场景是需要大量I/O操作的程序,通过NIO的方式可以很好的分离出I/O操作模块负责程序的所有I/O操作,同时对于程序的使用性能也有很大帮助;


BIO的使用:
主要通过io包来完成


NIO的使用
主要通过nio包来完成
三个关键的概念:Buffer,Selector,Channel

Buffer(缓存):内存中的一块区域以及和它相关的一些操作定义的对象,用于和Channel共同完成数据的读写操作;
对于Buffer的理解需要明白Java虚拟机,内存,磁盘之间的数据传输和交换方式;通过常用的操作函数即可了解Buffer的特点

Channel(通道):通道可同时读写,采用异步方式,同时Channel可将数据读取到Buffer中,或从Buffer中写入到Channel中;

Selector(选择器):监控每个Channel的状态,确定它是否处于可读或可写的状态,通过单个线程同时管理多个Channel,多个IO操作;


NIO工作流程:
读:打开通道–>注册读事件到Selector–>Selector查询到有可读数据–>完成通道上的数据传输

写:打开通道–>注册写事件到Selector,并附加要写的内容–>Selector查询到通道可写–>完成通道上的数据传输

注:之所以引入Buffer,一个重要原因是Buffer的读写机制很好的保证了在NIO的方式中数据的准确和完整;


当然也有AIO(异步,NIO 2.0)的机制, 主要通过回调的方式来实现,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序;
相关实现在nio包中
使用较少


Socket通讯
对于Socket的通讯,其实也可以理解成一种通过Socket方式的I/O,只是底层数据传输的方式不同,同样有BIO和NIO的机制,同样能够抽象成SocketChannel,只是创建的方式不同;


通过NIO机制实现的Socket通讯 实例
一些很少接触的I/O操作类的使用Pipe,ByteArray…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值