IO流是什么?
流是数据在数据源(文件)和程序(内存)之间经历的路径。
这样解释似乎是很抽象不易理解的,因此我们拿生活中的例子来说,我们可以把流看成流动的自来水,打开水阀,自来水就会通过水管从水源流到各个用户家中,同样的道理,水库中的水也会通过水管流入到水源。从水源流出到用户家为自来水的输出流
,而从水库流入到水源为自来水的输入流
,只有构成这样一个循环,自来水才能源源不断的被人们利用。
从java的角度分析,由于Java对数据的操作是通过流
的方式,而IO流能够处理设备之间的数据传输,例如:文件的上传和下载,Java用于操作流的对象都在IO包中。
IO流的分类:
关于java中IO流的分类,我们可根据流
或者单位
进行划分。
按流划分:
首先我们先来谈谈以流划分,以流划分可以分为两类,分别为输入流[数据的读取]和输出流[数据的写入]
从Java的角度分析,引入IO流的作用为:如果要实现从文件中读取数据,需要在程序和文件之间建立一条数据输入的通道,这样java程序才能从文件中读取数据;反之,如果要实现在Java程序中把数据写入文件,也需要在程序和文件之间建立一条数据输出的通道,这样才能通过java程序将数据写入文件中。
但这两条通道并不需要人为的去创建,而是我们在java程序中,一旦创建输入流对象
,那么Java会自动建立数据输入通道
,同理创建输出流
时,Java也会自动建立数据输出通道
,如下图所示的解释更为直观:
简单点来说:输入流是数据从数据源(文件)到程序(内存)的路径,是一个读取数据
的过程,输出流是数据从程序(内存)到数据源(文件)的路径,是一个创建数据
的过程。
按单位划分:
根据单位进行划分,可以分为字节流和字符流。
java中的字节流有InputStream、OutputStream,字节流处理的单元为1个字节(byte),操作的对象为字节和字节数组,文件存储的形式为二进制,对于音频文件、图片、歌曲,我们推荐使用字节流
java中的字符流有Reader、Writer;它处理的单元为2个字节的Unicode字符,操作的对象为字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,对于文本文件,我们推荐使用字符流
那么它们之间有什么关系呢?
我们知道计算机中的所有文件储存都是以字节的形式进行的,在磁盘上保留的并不是文件的字符,而是先把字符编码成字节,再储存这些字节到磁盘。当读取文件(特别是文本文件)时,也是一个字节地读取便于形成字节序列。
字节流可用于任何类型的对象
,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流是最基本的,主要用在处理二进制数据,它是按字节来处理的,但在实际应用中,很多的数据都是文本类型,因此又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联,我们在实际开发中经常遇到的汉字乱码问题,实际上就是由于字符流和字节流之间转化不统一而造成的