目录
一、IO流概述
I是input的缩写,O是output的缩写
二、IO流分类
把硬盘里的内容加载到内存里,这就是一个输入动作,输入对应的是读数据
把内存中的内容放到硬盘上,这是一个输出动作,对应的写数据
字符流和字节流使用情况:
我们打开一个记事本文件,可以阅读,这种就可以用字符流
然后我们再用记事本的方式打开一个jpg文件
我们发现读不懂,这种就只能用字节流
三、InputStream类
他的所有子类都是以InputStream作为后缀的
他是一个抽象类,是所有字节输入流的超类
四、OutputStream类
他也是一个抽象类,表示所有字节输出流的超类
五、字节流写数据
写数据是把内存中的内容写到硬盘中,我们的程序运行是在内存中的,所以对于程序来说写进硬盘相当于是程序的输出流
OutputStream是一个抽象类,所有我们要找他儿子来使用
我们写数据是要写到文件的,前面学过的File就是用来写文件的
FileOutputStream类
使用他实现字节流写数据
使用他的构造方法
代码演示:
执行后发现左边多了一个fos.txt文件
执行这个语句做了三件事如上图
接下来写数据,还需要抛出异常,这个时候抛出的异常会把之前那个异常替换掉,因为现在要抛出这个异常是已经写了这个异常的父类,所以两个都可以抛出这个异常
这个时候抛出的异常已经变成了IOException
我们点开看一下文件:
我们发现变成了a,因为当我们用记事本打开就做了一个转换,a底层对应的数据就是97
我们可以这样写:
打开文件:
当然这里的是字符9和7,而不是数字97
注意:
所有和IO相关操作的内容,最后都要释放资源、
使用close()方法释放资源
close把之前我们调用系统功能创建资源那些调用的系统全部释放
六、字节流写输入的三种方式
看一下他底层的执行:
当传进来的name不等于null时,就new 一个File
第二条语句括号里边的相对于是第一条语句的底层实现方式,写的时候直接按照第一种写法,因为会自动封装
FileOutputStream的两种写入方式:
1.void.write(int b)方法
文件中:
2.void write(byte[] b)方法
文件中:
我们还可以通过String类里边的getBytes()方法,直接把要得到的字符串写入
文件中:
3.void write(byte[] b,int off ,int len)方法
文件中:
如果从1开始写入那文件中就应该是bcd了
七、字节流写数据的两个小问题
1.字节流写入数据实现换行
文件中:
然后我们现在打开文件用Windows记事本的方式打开文件
我们发现没有换行,因为不同系统对换行识别是不同的
2.字节流写数据实现追加写入
用这个构造方法
写true就表示添加到末尾
我们看一下执行两次这个代码的文件
发现有20个hello
3.小结
八、字节流写数据加异常处理
使用try catch处理异常时当我们走到fos.write(“hello”,getBytes())时出现异常就会去执行catch,这样的话我们fos.close()就执行不到,然后资源就会一直被占用
我们需要使用finally关键字:
代码演示:
这样写fos红了,是因为我们fos是在try中定义的,在finally中看不到,所以我们需要在外边定义fos
还是在报错,说没有被初始化,所以要进行初始化
但是close()又报错了,是因为有一个异常没有处理
我们用try catch 处理一下
当我们的文件创建失败时,我们继续执行就会在fos.close()抛出空指针异常,因为开始定义的null,所以null调用close肯定会空指针异常
我们需要写一个if来加权代码健壮性