Java NIO简介

Java nio (new io) 是从java 1.4 版本开始引入有的一个新的IO API 可以替代标准的java io API.

NIO 和原来的io有同样的作用和目的,但是使用方式完全不通,NIO支持面向缓存区的基于通道的IO操作,NIO将以更加高效的方式进行文件的读写操作。

|io|nio| |-------|-------| |面向流|面向缓冲区| |阻塞io|同步非阻塞io| |无|selector选择器 ### 通道和缓冲区 Java nio 系统的核心在于:通道(channel) 和缓冲区(buffer) 通道表示打开到IO设备(例如:文件、套接字)的连接,若需要使用NIO,需要获取用于连接IO的通道以及用于容纳数据的缓冲区,然后操作缓冲区,对数据进行处理。 1. 先建立通道 2. 创建缓冲区 3. 操作缓冲区 ### io 输入流的读取数据逻辑 1. io读取数据 - 打开一个io流 - 循环 - 读取数据 - 关闭io流 2. io写入数据 - 打开一个io流 - 循环 - 写入取数据 - 关闭io流 ### 相关概念 - Java.io 中最为核心的一个概念就是流,面向流的编程,一个流要么是输入流要么是输出流,不可能同时即是输出流又是输出流
  • Java.nio中拥有3个概念 selector channel 和 buffer 在java.nio中我们是面向块(blocl)或是缓冲区(buffer)编程的 buffer本事就是一个堆存区域地址是线上他就是一个数组,数据的读和写都是通过buffer来实现的

  • 除了数组之外,buffer还提供了对于数据的结构化访问方式,并且可以追踪到系统的读写过程

  • java中的8种原生数据类型都有各自对应的buffer类型 如intbuffer longbuffer bytebuffer charbuffer boolean除外

  • Channel 指的是可以向其写入数据或是从中读取数据对象,它类似于 java中的stream

  • 所有数据的读写都是通过buffer来进行的,永远不过出现直接向channel写入数据的情况,或是直接从channel读取数据的情况

  • 与stream不同的是 channel是双向的 一个流只可能是inputstream 或是outputstream,channel打开后可以进行读取写入或是读写

  • 由于channel是双向的因此他能更好的放映出操作系统的真实情况,在linux系统中底层操作系统的通道就是双向的

    java io 和 nio的区别

    image.png
    image.png