Java I/O体系详细讲解

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

注意:

此文侧重讲解Java的IO主要体系,至于具体API功能会在后面的文章详细讲解。

I/O以及I/O流的定义:

  1. I/O实际上是Input/Output,也就是输入/输出,输入指的是从存储设备中读取数据,比如从磁盘读取数据到内存中;输出指的是把数据回写到存储设备中,比如把内存中的数据回写到磁盘中。
  2. 流是一种抽象概念,可以类比成水流,而数据类比成水,数据流的传递可以类比成水流的传输,是一种无结构化的数据传递。

Java中的I/O

I/O的数据来源有:磁盘、内存、网络、键盘等。

  1. 输入流:Java的输入流是指从数据来源读取数据到内存的流。比如从磁盘读取数据到内存的流,从网络读取到内存的流,从内存读取到内存的流等都是输入流。
  2. 输出流:Java的输出流是指从内存回写到数据源的流。比如从内存输出到网络的流,从内存回写到磁盘的流等等都是输出流。
Java的I/O体系:

java中的IO流的类有很多,但是实际上核心的体系只有File、InputStream、OutputStream、Writer、Reader。

  1. File类:Java对文件的抽象,是为文件或者目录进行删除、重命名,移动、创建等很多操作而设计的一个类。

IO流的分类:
IO流按照操作的数据单元可以分为字节流跟字符流:字节流与字符流的区别

  1. 字节流:操作的数据单元是8位的字节。以InputStream(输入流)、OutputStream(输出流)作为抽象基类。这种流的API操作的数据单位是字节。适用于任何数据的传输。
  2. 字符流:操作的数据单元是字符,以Writer(输出)、Reader(输入)作为抽象类。这种流的API操作的数据单位是字符,会把若干个字节按照一定的编码规则编码成字符。只适用于文本类数据的传输,不能用于类似图片,音频等二进制数据的传输。
下图是一个JAVA I/O体系的脑图:

在这里插入图片描述

JAVA IO的原理:

文件读取原理图:(这是基于文件的IO,网络IO后面会有):
在这里插入图片描述

说明:
我们平时的应用进程是运行在用户态里面,对硬件的操作要在内核态中通过系统调用实现。而用户与内核态的切换要消耗系统资源。区分用户态和内核态主要是为了系统的安全性考虑。内核态会拥有用户态不具有的权限。

原理图说明:

  1. 用户进程调用输入流的read方法,然后尝试读取用户缓冲区的数据,如果能读取到数据,直接返回,如果读取不到就进入第二步。
  2. 如果用户缓冲区读取不到数据,就调用read0方法,从内核缓冲区读取数据到用户缓冲区。
  3. 调用read0方法后,切换到内核态,内核通过系统调用发送指令给磁盘控制器,要求读取磁盘的数据到内核缓冲区。
  4. 磁盘控制器调用DMA,从磁盘中读取数据到内核缓冲区。
  5. 数据读取完毕后,用户进程从内核缓冲区读取数据到用户缓冲区。
  6. 然后从用户缓冲区读取数据返回。

文件写入原理流程图:
在这里插入图片描述

体系的详解文章:

Java IO之File类详解

Java I/O体系之OutputStream和InputStream详细讲解

Java I/O体系之Writer和Reader详细讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值