Java基础之I/O框架体系

概述

Java中的I/O包主要分布在 java.iojava.nio两个包中,从传统发展来看,由浅入深即是: BIO -> NIO -> AIO
这三个概念分别表示: 阻塞 I/O, 多路非阻塞 I/O,异步非阻塞 I/O。
io包下是传统的字节流和字符流,nio是jdk1.4之后提出,新增了buffer、channel、selector等概念,
aio又叫做又叫做nio2,比nio更高效,多用于网络编程。

java.io

io主要解决的就是 数据传输的问题,从传输方式上分,可以分为 磁盘 I/O网络 I/O, 从传输格式上分,可以分为 基于字节的 I/O基于字符的 I/O

  • 基于字节操作的 I/O 接口:InputStream 和 OutputStream
  • 基于字符操作的 I/O 接口:Writer 和 Reader
  • 基于磁盘操作的 I/O 接口:File
  • 基于网络操作的 I/O 接口:Socket

字节 I/O

输入流:

Java基础之I/O框架体系_第1张图片

输出流:

Java基础之I/O框架体系_第2张图片

字符I/O

虽然传输的最小的存储单元都是字节,但程序中通常操作的数据都是以字符形式。因此 字符 I/O 还涉及一个 编码转换 的问题。

写字符的 I/O:

Java基础之I/O框架体系_第3张图片

读字符的 I/O:

Java基础之I/O框架体系_第4张图片

字符解码StreamDecoder:

Java基础之I/O框架体系_第5张图片

字符编码StreamEncoder:

Java基础之I/O框架体系_第6张图片

以上图片均来自:
深入分析Java I/O的工作机制

磁盘I/O

磁盘I/O就是将数据持久化到物理磁盘。Java 中通常的 File 并不代表一个真实存在的文件对象,一个代表这个路径相关联的一个虚拟对象。File可能是一个文件,也可能是一个文件夹。

网络I/O

写网络实际上也是写文件,只不过底层操作系统需要将数据传送到其它地方而不是本地磁盘。Socket没有具体的实体,只是计算机之间完成相互通信一种抽象。Socket有多种,大部分情况下都是基于 TCP/IP 的流套接字。

  • 要建立Socket连接,必须通过TCP/IP协议建立TCP连接。
  • 要建立TCP连接,需要依靠 IP 协议来寻址网络中的主机。
  • 通过 TCP 或 UPD 的地址,也就是端口号来定位 主机上的 某一个程序的 链路。

java.nio

NIO 是相对 BIO说的,
不管是磁盘 I/O 还是网络 I/O,数据在写入 OutputStream 或者从 InputStream 读取时都有可能会阻塞。NIO中几个核心的类有

Buffer

缓冲区 , 包含一些要写入或者读出的数据.

ByteBuffe、CharBuffer、 ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer

Channel

通道 ,对数据的读取和写入要通过Channel,它就像水管一样,是一个双向通道。

SelectableChannel(用于网络读写),FileChannel(用于文件操作)

Selector

多路复用器,提供选择已经就绪的任务。 一个Selector可以同时轮询多个Channel。

  • Selector 可以同时监听一组通信信道(Channel)上的 I/O 状态
  • 如果没有至少一个信道 I/O 状态有变化,那么 select 方法会阻塞等待或在超时时间后会返回 0
  • Selector通过 selelct() 取得 SocketChannel
  • 如果有多个信道有数据,那么将会将这些数据分配到对应的数据 Buffer 缓冲区中

AIO

NIO 2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现,是真正的异步非阻塞I/O。
不需要过多的Selector对注册的通道进行轮询即可实现异步读写,从而简化了NIO的编程模型。

参考: 深入分析 Java I/O 的工作机制
扩展阅读:
Java NIO Tutorial

在 Java 7 中体会 NIO.2 异步执行的快乐

你可能感兴趣的:(Java基础)