Java流

95 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

面试复习。加油。


持续整理更新中。。。

前言

这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

我们在开发软件的过程中可以发现,几乎所有的应用软件都离不开信息的输入和输出,比如从键盘读取数据、从文件中获取数据、向文件中存入数据等等,这些情况下都会涉及有关输入、输出的处理,也就是涉及到了 Java 的 IO 流。可能很多小伙伴对 IO 流都不太了解(有的小伙伴甚至看到 IO 流就会主动逃避),那么今天就来聊聊基础的 Java IO 流,让各位小伙伴从此不在怕 IO。

基础 Java IO 流

首先咱们先看看 IO 流的概念(以下内容来自百度👇)

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出 。

百度给出的基本概念可能有些难理解,那么大聪明依然是秉承着“繁琐问题必有猥琐解法”的宗旨来给各位小伙伴用大白话讲讲 IO 流。

咱们先举个简单的例子:我们用水壶往杯子里倒水的时候,水壶里的水不可能一下子就跑到杯子里,而是需要一个倒水的过程。这个过程是一个连续的过程,源源不断进行着。回到计算机上来,我们需要将硬盘里的数据传到内存中以便处理,但是由于传输带宽等方面的限制,硬盘中的数据不可能立马就传到内存中,而是需要一点点进行的,就像从水壶里往杯子里倒水一样。流这个词,生动形象说明了数据传输的过程。

在前言中我们提到了“几乎所有的应用软件都离不开信息的输入和输出”,那么我们输入或者输出的是什么东西呢?没错,我们输入或输出的就是数据(也就是一组有顺序的、有起点和终点的字节集合),我们将这些数据称作为数据流(Data Stream) ,下面我们再看看关于流的分类👇。

① 按照数据流的流向,我们可以将其分为输入流和输出流(需要注意的是:这里的输入、输出是针对程序来说的),把数据从其他设备上读取到内存中的流就是输入流,把数据从内存中写出到其他设备上的流就是输出流。 ② 按照所处理的数据的单位,我们可以将其分为字节流和字符流,字节流的含义就是每次读取(或写入)一个字节,此时如果传输的资源文件有中文,那么就会出现乱码;字符流的含义就是每次读取(写入)两个字节,使用字符流可以正确的显示中文(1字符 = 2字节, 一个汉字占两个字节长度)。字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件;字符流一般用于处理纯文本类型的文件,如 txt 文件等,但不能处理图像或者视频之类的非文本文件。用一句话总结一下就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。 ③ 按照流的角色进行划分,我们还可以将其分为节点流和处理流,节点流指的是可以从(向)一个特定的 IO 设备(如磁盘,网络)读取(写入)数据的流(与“数据源”和“目的地”直接相连);处理流则是用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能(不直接连接到“数据源”和“目的地”上,而是连接在已存在的流上)。如下图所示👇

在这里插入图片描述 ④ 缓冲流,缓冲流是诸多流中尤为重要的一员。程序与磁盘的交互的速度相对于内存运算的速度是很慢的,也就说程序与磁盘的交互效率的高低直接影响到了程序性能的高低,为了提高程序与磁盘的交互的效率,缓冲流也就应运而生了,缓冲流在内存中设置一个缓冲区,普通流每读取一个子节,就将该子节先存入缓冲区,当缓冲区存储了足够的子节后再与磁盘进行交互,也就是在保证了在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数,从而提高了交互效率。举个例子,我们在搬家的时候总会找个小货车来帮我们搬家,我们把需要搬走的行李先放到小货车上,等小货车装满了以后再开车往新家运送,我们借助小货车减少了我们往返旧家和新家的次数,从而提升了搬家的效率,这里的小货车就是缓冲区,我们自己就普通流,自己的行李就是普通流读取的子节。(这要是靠两条腿搬着行李往返新家和旧家,估计搬三天都搬不完😂) P.S. 使用缓冲流不一定会提升程序运行效率,是否使用缓冲流就需要具体情况具体分析了