每日一道面试题之java 中 IO 流分为几种?

IO流是什么?

流是数据在数据源(文件)和程序(内存)之间经历的路径。

这样解释似乎是很抽象不易理解的,因此我们拿生活中的例子来说,我们可以把流看成流动的自来水,打开水阀,自来水就会通过水管从水源流到各个用户家中,同样的道理,水库中的水也会通过水管流入到水源。从水源流出到用户家为自来水的输出流而从水库流入到水源为自来水的输入流,只有构成这样一个循环,自来水才能源源不断的被人们利用。

从java的角度分析,由于Java对数据的操作是通过流的方式,而IO流能够处理设备之间的数据传输,例如:文件的上传和下载,Java用于操作流的对象都在IO包中。

IO流的分类:

关于java中IO流的分类,我们可根据或者单位进行划分。

按流划分:

首先我们先来谈谈以流划分,以流划分可以分为两类,分别为输入流[数据的读取]和输出流[数据的写入]

从Java的角度分析,引入IO流的作用为:如果要实现从文件中读取数据,需要在程序和文件之间建立一条数据输入的通道,这样java程序才能从文件中读取数据;反之,如果要实现在Java程序中把数据写入文件,也需要在程序和文件之间建立一条数据输出的通道,这样才能通过java程序将数据写入文件中。

但这两条通道并不需要人为的去创建,而是我们在java程序中,一旦创建输入流对象,那么Java会自动建立数据输入通道,同理创建输出流时,Java也会自动建立数据输出通道,如下图所示的解释更为直观:

每日一道面试题之java 中 IO 流分为几种?_第1张图片

简单点来说:输入流是数据从数据源(文件)到程序(内存)的路径,是一个读取数据的过程,输出流是数据从程序(内存)到数据源(文件)的路径,是一个创建数据的过程。

按单位划分:

根据单位进行划分,可以分为字节流字符流

java中的字节流有InputStream、OutputStream,字节流处理的单元为1个字节(byte),操作的对象为字节和字节数组,文件存储的形式为二进制对于音频文件、图片、歌曲,我们推荐使用字节流

java中的字符流有Reader、Writer;它处理的单元为2个字节的Unicode字符,操作的对象为字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,对于文本文件,我们推荐使用字符流

那么它们之间有什么关系呢?

我们知道计算机中的所有文件储存都是以字节的形式进行的,在磁盘上保留的并不是文件的字符,而是先把字符编码成字节,再储存这些字节到磁盘。当读取文件(特别是文本文件)时,也是一个字节地读取便于形成字节序列。

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

字节流是最基本的,主要用在处理二进制数据,它是按字节来处理的,但在实际应用中,很多的数据都是文本类型,因此又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联,我们在实际开发中经常遇到的汉字乱码问题,实际上就是由于字符流和字节流之间转化不统一而造成的

每日一道面试题之java 中 IO 流分为几种?_第2张图片

你可能感兴趣的:(Java八股文面试题,java,jvm,面试,后端,ide)