IO流解析

I /O (input   Output)

 I   输入:读取外部数据(磁盘,光盘等存储设备的数据)到程序(内存)中。

O  输出:将程序(内存)中的数据输出到磁盘,光盘等存储设备中。

所以java中的I/O流指的就是输入流,输出流,这两个种流分别都分为字节流和字符流

——     字节流比字节为单位来处理输入,输出操作。

——    字符流比字符为单位来处理输入,输出操作。

流分为字节流和字符流:

字节流:建立在InputStream和OutputStream这两个抽象类基础上,一般用来处理字 节或二进制对象。

字符流:建立在Reader和Writer这两个抽象类基础上,一般用来处理字符或字符串。

NIO

NIO是什么?

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

IO(BIO)相比具备哪些优势?

传统IO(BIO)模型劣势:

1、线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。

2、线程本身占用较大内存,像Java的线程栈,一般至少分配512K1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。

3、线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高、CPU sy使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。

4、容易造成锯齿状的系统负载。因为系统负载是用活动线程数或CPU核心数,一旦线程数量高但外部网络环境不是很稳定,就很容易造成大量请求的结果同时返回,激活大量阻塞线程从而使系统负载压力过大。

(个人理解:把传统的io比喻为粉笔,粉笔切成十节,把十节粉笔一个一个的给别人,在其中切粉笔和别人拿到手上就占了一半的时间(资源)。这就造成资源浪费。如果有上千根粉笔这就造成load(负载)偏高。)

NIO的优势:

事件驱动模型

避免多线程

单线程处理多任务

非阻塞I/OI/O读写不再阻塞,而是返回0

基于block的传输,通常比基于流的传输更高效

更高级的IO函数,zero-copy

IO多路复用大大提高了Java网络应用的可伸缩性和实用性

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

Channel(通道):既可以从通道中读取数据,又可以写数据到Channel(通道),通道分两类,一:网络读写(selectableChannel),另一类是文件操作(FileChannel)。

Buffer(缓冲区)一个 Buffer 其实就是一块内存区域,我们可以在这个内存区域中进行数据的读写. NIO Buffer 其实是这样的内存块的一个封装, 并提供了一些操作方法让我们能够方便地进行数据的读写。Buffer 类型有ByteBuffer,CharBuffer,DoubleBuffer等等。

Selector(选择区):是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。

(个人理解:把传统的io比喻为粉笔,粉笔切成十节,把十节粉笔放在一个管道(Channel)里面,十节粉笔在等待(Buffer),然后选择(Selector)你要不要。这个不管切粉笔的过程和粉笔在别人手上的过程。)

成熟的NIO框架如MINA、Netty。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值