目录
一、IO流是什么?
1.所谓的I/O就是Input/Output的缩写,用于处理数据传输,例如数据的读和写,网络通讯等操作,Input(输入)读取外部数据到程序(内存)中,Output(输出)将程序(内存)数据输出到磁盘等设备中。
2.所谓的流(stream),是java程序中,对于数据输入/输出的操作的方式,流的分类方式大致为三种。
(1)按照数据单位:字节流(8bit),字符流(按字符)
(2)按照流的方向:输入流,输出流
(3)按照流的角色:节点流,处理流(包装流)
3.java.io包下提供了各种流类的接口。
二、文件的基础知识
1.什么是文件
文件,这个我们并不陌生的词汇,是保存数据的地方,它可以保存图片,视频等等。
2.文件流
文件在程序中是以流的方式来操作的
我们平时经常对文件进行操作,可能认为输入就是对文件等地址进行输入操作,其实在文件流这里,我们把从内存中输出到叫做输出流,把输入到内存中的叫输入流,所以输入输出是相对于内存的概念。
3.文件的基本操作
<1>创建文件对象相关的构造器
解读:1.上图是使用文件的构造方法File(String pathname)创建的对象file1
2.通过对象我们调用方法createNewFile(),此方法的解释是,当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件,简便的说就是指定的文件名不能已经存在,这里不可分是意思是,如果在创建文件的过程中出现任何错误或中止,那么就不应该创建这个文件,也不应该留下任何部分创建的痕迹。也就是说,创建文件的过程必须是完整的、不可中断的。
3.注意这个createNewFile()方法会有IO异常,使用try catch抛出异常。
<2>获取文件的相关信息
了解了java的文件基础知识后我们正式开始对java io流的介绍
三、输入/输出流
首先我们在文章开始时通过数据单位讲流分为了字节流和字符流,那么两者有什么关系和使用场景呢?
其实字节流和字符流几乎一样,但主要还是在处理数据时,单位不同,首先我们要知道在UTF-8编码中,中文汉字是占3个字节的,如果我们使用字节流就会出现一个汉字分三次读取,这样就会出现乱码情况,所以字符流也因此而产生了。
使用场景:字节流可以处理一切文件,而字符流只能处理纯文本文件
<1>字节流
字节流主要是两个抽象的类InputStram和OutputStream,是字节流的基类
由图中我们可以看出所有具体的字节流实现类都是继承了InputStream,OutputStraeam也是同样的道理.
<2>InputStream
1.FileInputStream:文件输入流,一个非常重要的字节输入流,用于对文件进行读取操作。
2.FilterInputStream:装饰者类,具体的装饰者继承该类,这些类都是处理类,作用是对节点类进行封装,实现一些特殊功能。
3.BufferedInputStream:缓冲流,对节点进行装饰,内部会有缓冲区,用来存放字节,每次都是将缓冲区存满后发送,而不是一个一个的发送,这样效率高。
4.ObjectInputStream:对象输入流,用来提供对基本数据或对象的存储,通常应用在反序列化中,有参构造是一个InputStream的实例对象。
下面我们使用文件输入流去读取文件内容
首先我们指定文件的地址,然后创建文件流对象,readDate用来获取read的值,开辟空间并将地址赋值给流对象,这里有异常主要try catch或者throws掉异常
流对象中有了文件地址后,我们使用read()方法去读取文件,注意read方法返回int类型的值
当读取到文件末尾时返回-1,注意要输出字符类型需要强制转换,最后我们读取完毕后,一定要去关闭流,否则会造成资源浪费。
我们从结果可以发现中文会发生乱码,这就是一个个字节读取的问题,在UTF-8中一个中文是占3个字节的,也就是说我们把一个汉字分成三个字节读取了,发生了乱码现象。
<3>OutputStream
OutputStream类继承关系和InputStream类似
首先我们指定文件路径,创建输出流对象,再把地址给流对象,调用write方法先放入一个字符
然后再放入一个字符串,最后关闭文件流
<4>字符流
字符流也主要有两个抽象基类分别是Reader和Writer
<4.1>Reader
各个实现类:
1.InputStreamReader:从字节流到字符流的桥梁,InuptStreamReader(FileInputStream file),读取字节并使用特定的字符集将其解码为字符,使用的字符集可以指定。
2.FileReader:用于读取字符文件的类。
3.BufferedReader:从字符输入流中读取文本,设置一个缓冲区来提高效率。
4.CharArrayReader:从char数组中读取流
首先我们指定文件路径,创建字符输入流,传入地址,循环遍历读取内容,最后关闭流.
从结果可以看出和字节流不同字符流可以输出中文.
另外我们也可以使用字符数组来读取从而提高效率
<4.2>Writer
![]()
使用字符输输出流创建文件并写入内容
对于FileWriter一定要关闭流,否则会写入失败的.
![]()
四、节点流/处理流
<1>.节点流:可以从特定的数据域读写数据,如FileReader、FileWriter
<2>.处理流:处理流也叫包装流,是链接在已存在的流之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter
处理流在关闭时会自动关闭被包装的节点流,故只需要关闭外层流即可
使用BufferedReader读取文本文件
![]()
使用BufferedWriter写入文本文件