【JAVA基础】Java IO详解

1. 概述

IO
计算机系统的IO即通过数据流、序列化和文件系统提供系统输入和输出。


流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或者是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。

Java把这些不同来源和目标的数据都统一抽象为数据流。

分类
按流向分:
1)输入流:程序可以从中读取数据的流;
2)输出流:程序能向其中写入数据的流

按数据传输单位分:
1)字节流:以字节为单位传输数据的流;
2)字符流:以字符为单位传输数据的流;

按功能分:
1)节点流:用于直接操作目标设备的流;
2)过滤流:是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。


2. Linux同步IO

2.1 阻塞IO

在阻塞式IO模式下,当系统调用read后,如果此时内存数据未准备好,用户线程会被阻塞,等数据准备好,并从内核缓存区将数据拷贝至用户空间后,read指令才会返回。


2.2 非阻塞IO

非阻塞IO发出read请求后,发现数据没有准备好,会继续往下执行,此时应用程序会不断轮询polling内核询问数据是否准备好,当数据没有准备好时,内核立即返回EWOULDBLOCK错误。直到数据被拷贝到应用程序缓冲区,read
请求才获取到结果。

这种方式虽然较阻塞式有了性能的提升,但依旧会对性能造成影响,因为这过程是需要应用程序不断对内核进行轮询操作的。


2.3 IO多路复用

IO多路复用就解决了非阻塞式IO的缺点,即它不会对内存进行轮询操作,当内核数据准备完毕,以事件通知机制告知应用进程已经准备好了,在此之前,应用进程可以忙其他的工作,从而减少对性能的影响。

通过多路IO复用,能使得一个进程同时处理多路IO,提升服务器吞吐量。

1) select

select函数

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

select() 的机制中提供一种 fd_set 的数据结构,实际上是一个long类型的数组,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读。

使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。

缺点
1)select 只能监控1024个连接;
2)


3. Linux异步IO


4. Java IO


5. 参考文献

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值