IO流的总结

目录

一、IO流是什么?

二、文件的基础知识

1.什么是文件

2.文件流

3.文件的基本操作

<1>创建文件对象相关的构造器

<2>获取文件的相关信息

三、输入/输出流

<1>字节流

<2>InputStream

<3>OutputStream

<4>字符流

<4.1>Reader

<4.2>Writer

四、节点流/处理流


一、IO流是什么?

1.所谓的I/O就是Input/Output的缩写,用于处理数据传输,例如数据的读和写,网络通讯等操作,Input(输入)读取外部数据到程序(内存)中,Output(输出)将程序(内存)数据输出到磁盘等设备中。

2.所谓的流(stream),是java程序中,对于数据输入/输出的操作的方式,流的分类方式大致为三种。

(1)按照数据单位:字节流(8bit),字符流(按字符)

(2)按照流的方向:输入流,输出流

(3)按照流的角色:节点流,处理流(包装流)

3.java.io包下提供了各种流类的接口。

二、文件的基础知识

1.什么是文件

文件,这个我们并不陌生的词汇,是保存数据的地方,它可以保存图片,视频等等。

2.文件流

文件在程序中是以流的方式来操作的

f3b8ccae7b964d2cb885805862692747.png

我们平时经常对文件进行操作,可能认为输入就是对文件等地址进行输入操作,其实在文件流这里,我们把从内存中输出到叫做输出流,把输入到内存中的叫输入流,所以输入输出是相对于内存的概念。 

3.文件的基本操作

<1>创建文件对象相关的构造器

7400745cb5784340810b2b4a11d5c3f9.png

f28e64fbe476411e9352fb2632015337.png

解读:1.上图是使用文件的构造方法File(String pathname)创建的对象file1

         2.通过对象我们调用方法createNewFile(),此方法的解释是,当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件,简便的说就是指定的文件名不能已经存在,这里不可分是意思是,如果在创建文件的过程中出现任何错误或中止,那么就不应该创建这个文件,也不应该留下任何部分创建的痕迹。也就是说,创建文件的过程必须是完整的、不可中断的。

         3.注意这个createNewFile()方法会有IO异常,使用try catch抛出异常。

<2>获取文件的相关信息

fbc841fa81e5437bbf1f66b2aab441d5.png

d30fb4f8a6124cad8e5b373430ad5f70.png

bf5c058f513044dc92c0b2428373cb18.png

f03de9eab97d483fbea42c750ea10037.pngb7079d966f3548ecb1ff1d6c96a4111b.png

3dfae97fd8814b75a30a70fe89417264.png

 2b19b8f5cb0f4a9eba76632f06464d17.png

666eb02ba60a45b1ad1f303939dee660.png

了解了java的文件基础知识后我们正式开始对java io流的介绍

三、输入/输出流

首先我们在文章开始时通过数据单位讲流分为了字节流和字符流,那么两者有什么关系和使用场景呢?

其实字节流和字符流几乎一样,但主要还是在处理数据时,单位不同,首先我们要知道在UTF-8编码中,中文汉字是占3个字节的,如果我们使用字节流就会出现一个汉字分三次读取,这样就会出现乱码情况,所以字符流也因此而产生了。

使用场景:字节流可以处理一切文件,而字符流只能处理纯文本文件

<1>字节流

字节流主要是两个抽象的类InputStram和OutputStream,是字节流的基类7f56e5cb4ce94a3ab1e409be66d0a5c4.png

由图中我们可以看出所有具体的字节流实现类都是继承了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写入文本文件

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星星妳睡了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值