综合复习(三)——IO流

IO流的概念

输入输出(IO)是指计算机同任何外部设备之间的数据传递。常见的输入输出设备有文件、键盘、打印机、屏幕等。数据可以按记录(或称数据块)的方式传递,也可以 流的方式传递。

IO流的原理

数据流是接收数据或发送数据的管道

流的单向性:
可以从输入流读,但不能从输入流写

可以从输出流写,但不能从输出流读

IO的结构图

在这里插入图片描述

java 中所有的I/O流都基于四个基类:
输入流输出流
InputStreamOutputStream
ReaderWriter
面向字节面向Unicode字符
InputStreamReader
OutputStreamWriter
NIO是什么?

是一种同步非阻塞的I/O模型,成为解决高并发与大量连接、I/O处理问题的有效方式。

IO与NIO有什么区别?

IO: io流是阻塞式的,在阻塞模式中,线程将在读或写时阻塞,一直到读或写操作彻 底完成。如果在读的时候,数据尚未完全到达,则线程将在读操作上阻塞,一直到数据可用。

NIO: nio流是非阻塞的,在非阻塞模式中,线程将读取已经可用的数据(不论多少),然后返回执行其它任务,速度快,效率高。

原来的阻塞方式可能会造成大量的thread进入阻塞状态,占用大量的系统资源,现在的非阻塞方式避免了这个问题。

IO与NIO相比具有哪些优势?

IO模型劣势:

  1. 线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。
  2. 线程本身占用较大内存,像Java的线程栈,一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。
  3. 线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高、CPU
    sy使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。
  4. 容易造成锯齿状的系统负载。因为系统负载是用活动线程数或CPU核心数,一旦线程数量高但外部网络环境不是很稳定,就很容易造成大量请求的结果同时返回,激活大量阻塞线程从而使系统负载压力过大。

NIO的优势:

  1. 事件驱动模型
  2. 避免多线程
  3. 单线程处理多任务
  4. 非阻塞I/O,I/O读写不再阻塞,而是返回0
  5. 基于block的传输,通常比基于流的传输更高效
  6. 更高级的IO函数,zero-copy
  7. IO多路复用大大提高了Java网络应用的可伸缩性和实用性
NIO主要有三大核心部分
  1. Channel(通道)
  2. Buffer(缓冲区)
  3. Selector(选择器)

传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

成熟的NIO框架如MINA、Netty

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值