注意:
此文侧重讲解Java的IO主要体系,至于具体API功能会在后面的文章详细讲解。
I/O以及I/O流的定义:
- I/O实际上是Input/Output,也就是输入/输出,输入指的是从存储设备中读取数据,比如从磁盘读取数据到内存中;输出指的是把数据回写到存储设备中,比如把内存中的数据回写到磁盘中。
- 流是一种抽象概念,可以类比成水流,而数据类比成水,数据流的传递可以类比成水流的传输,是一种无结构化的数据传递。
Java中的I/O
I/O的数据来源有:磁盘、内存、网络、键盘等。
- 输入流:Java的输入流是指从数据来源读取数据到内存的流。比如从磁盘读取数据到内存的流,从网络读取到内存的流,从内存读取到内存的流等都是输入流。
- 输出流:Java的输出流是指从内存回写到数据源的流。比如从内存输出到网络的流,从内存回写到磁盘的流等等都是输出流。
Java的I/O体系:
java中的IO流的类有很多,但是实际上核心的体系只有File、InputStream、OutputStream、Writer、Reader。
- File类:Java对文件的抽象,是为文件或者目录进行删除、重命名,移动、创建等很多操作而设计的一个类。
IO流的分类:
IO流按照操作的数据单元可以分为字节流跟字符流:字节流与字符流的区别
- 字节流:操作的数据单元是8位的字节。以InputStream(输入流)、OutputStream(输出流)作为抽象基类。这种流的API操作的数据单位是字节。适用于任何数据的传输。
- 字符流:操作的数据单元是字符,以Writer(输出)、Reader(输入)作为抽象类。这种流的API操作的数据单位是字符,会把若干个字节按照一定的编码规则编码成字符。只适用于文本类数据的传输,不能用于类似图片,音频等二进制数据的传输。
下图是一个JAVA I/O体系的脑图:

JAVA IO的原理:
文件读取原理图:(这是基于文件的IO,网络IO后面会有):

说明:
我们平时的应用进程是运行在用户态里面,对硬件的操作要在内核态中通过系统调用实现。而用户与内核态的切换要消耗系统资源。区分用户态和内核态主要是为了系统的安全性考虑。内核态会拥有用户态不具有的权限。
原理图说明:
- 用户进程调用输入流的read方法,然后尝试读取用户缓冲区的数据,如果能读取到数据,直接返回,如果读取不到就进入第二步。
- 如果用户缓冲区读取不到数据,就调用read0方法,从内核缓冲区读取数据到用户缓冲区。
- 调用read0方法后,切换到内核态,内核通过系统调用发送指令给磁盘控制器,要求读取磁盘的数据到内核缓冲区。
- 磁盘控制器调用DMA,从磁盘中读取数据到内核缓冲区。
- 数据读取完毕后,用户进程从内核缓冲区读取数据到用户缓冲区。
- 然后从用户缓冲区读取数据返回。
文件写入原理流程图:


本文深入解析Java I/O流体系,涵盖字节流与字符流的概念,介绍File、InputStream、OutputStream、Writer和Reader等核心类的作用。并探讨了I/O流的数据来源,如磁盘、内存、网络和键盘等。
948

被折叠的 条评论
为什么被折叠?



