• Java IO


    一、Java IO流的40多个类都是从如下4个抽象类派生出来的。

    InputStream/Reader:所有的输入流基类,前者是字节输入流,后者是字符输入流。

    OutputStream/Reader:前者是字节输出流,或者字符输出流。

    解释:流是程序输入或输出的一个连续的字节序列,设备(例如鼠标,键盘,磁盘,屏幕和打印机)的输入和输出都是用流来处理的。在C语言中,所有的流均以文件的形式出现,不一定是物理磁盘文件,还可以是对应与某个输入/输出源的逻辑文件

    为什么I/O流操作要分为字节流操作和字符流操作?

    个人原因:

    1、字符流是由Java虚拟机将字节流转换得到的,计算过程比较耗时。

    2、如果不知道编码类型会出现乱码。

    音频文件、图片媒体等文件用字节流比较好。

    如果涉及到字符,还是字符流比较好。

    BIO属于同步阻塞I/O,Blocking I/O

    同步阻塞IO模型中,应用程序发起Read调用后,会一直阻塞,直到把内核数据拷贝到用户空间。

    在客户端连接数量不高的情况下是没问题的。但是面对十万甚至百万级连接的时候,传统BIO模型是无能为力的。

    NIO(Non-blocking)

    Channel(通道)、Buffer(缓冲区)、Selector(选择器)

    Java中的NIO可以看做I/O多路复用。

    同步非阻塞IO模型中,应用程序一直发起read调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到内核把数据拷贝到用户空间。

    一直轮询来查看当前数据是否准备好。

    NIO重点是把Channel,Buffer,Selector选择器三个类。

    其中Selector帮助线程来管理多个Channel。

    传统的IO操作基于数据流进行操作,而NIO基于Channel和buffer进行读写。

    NIO与传统的IO的区别:

      1、IO面向流、NIO面向缓冲区。因为缓冲区的存在,可以在缓冲区进行数据的前后移动,比如拆包和封包。

      2、channel和stream的区别,channel是双向读写,stream是单向读写。

      

    每一个channel都会对应一个buffer

    一个线程对应一个selector,一个selector对应多个channel连接

    程序切换到哪个channel是由事件决定的

    selector会根据不同的事件,在各个通道上切换 

    buffer就是一个内存块,底层是一个数组。

    数据的读取写入是通过Buffer完成的,BIO要么是输入流,或者是输出流,不能双向,但是NIO的Buffer是可以读也可以写。

    NIO和BIO的比较:

    1、BIO以流的方式处理  

    2、BIO是阻塞的、NIO是非阻塞的

    3、BIO基于字节流和字符流进行操作,而NIO基于Channel通道和buffer缓冲区进行操作,数据从通道读入到缓冲区,或者从缓冲区读入到通道。selector监听多个通道事件,因此使用单个线程就可以监听多个客户端通道。 

    4、Java NIO系统核心在与:通道(channel)和缓冲区(buffer)。通道表示打开IO设备

    缓冲区:一个用于特定基本数据类型的容器JavaNIO中的buffer主要用于NIO通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道的。

    ByteBuffer

    CharBuffer

    ShortBuffer

    IntBuffer

    LongBuffer

    FloatBuffer

    DoubleBuffer  

    通过allocate来分配容量。

    selector选择器

    selector是SelectableChannel对象的多路复用器,selector可以监控多个channel的状况,也就是说,利用selector可使一个单独的线程管理多个channel。selector是非阻塞的IO核心

    selector能够检测多个注册通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个时间相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接和请求。

    只有在连接/通道 真正有读写发生时候,才会读写,大大减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程。

    避免了上下文导致的开销。

    通道:由Java、nio、channel包定义的。Channel表示IO源与目标打开的连接。Channel类似于传统的“流”。只不过Channel不能直接访问数据,Channel只能与Buffer进行交互。

      

    AIO、NIO、BIO

    AIO:适用于连接数目多且连接比较长的架构,比如相册服务器,充分调用OS参与并发操作,编程复杂。用的较少。

    NIO:适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

    BIO:适用于连接数目少且连接比较小的架构,这种方式多服务器资源要求较高。

  • 相关阅读:
    免费的编程中文书籍索引 from github
    win7 Python 环境 准备 配置
    SQL Server 2008 允许远程链接,适用于广域网和局域网
    CTP API开发期货自动交易平台概论
    一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路
    一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码
    一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能
    一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法
    一步一步重写 CodeIgniter 框架 -- 原因和思路
    GDI双缓冲绘图
  • 原文地址:https://www.cnblogs.com/Alei777/p/16518981.html
Copyright © 2020-2023  润新知