IO模型学习

字节流读取一个字节,字符流每次读取一个字符

  • GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;
  • UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;
  • UTF-16be 编码中,中文字符和英文字符都占 2 个字节。

Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。

常见IO类:

磁盘操作:file

字节操作:InputStream outputStream

字符操作:reader  writer

对象操作:序列化 serializable

网络操作:socket

5I/O模型

  • 阻塞式 I/O  

进程等待内核准备好数据,完全阻塞等待,CPU释放,等待数据准备

 

  • 非阻塞式 I/O

轮询向内核获取数据是否准备完成,内核快速返回信息,不释放CPU,一直占用

 

  • I/O 复用(select 和 poll)

应用先向内核调用多个线程,select / poll 后,等待数据,等待套接字变为可用,此过程阻塞,当某个套接字可用时,应用调用程序进行数据读取,读取时该过程阻塞。优点是多个方法执行时,可以复用套接字(连接)

 

  • 信号驱动式 I/O(SIGIO)

应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的。内核加载数据完成后,发送信号通知应用程序,应用程序收到信号后,开始将数据复制到应用程序中。(收到信号后,通知应用程序可以进行IO操作)

  • 异步 I/O(AIO)

进行 aio_read 系统调用会立即返回,应用进程继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。(应用程序异步进行IO操作,不会阻塞)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值