昨天和前天,我们学习了IO流的一些基本用法,IO流其实就是输入输出流,以下是我对 IO流总结的一些知识小结, (整理的老师干货,满满的知识要点)
IO流
作用: 解决设备和 设备之间的数据传输问题。
内存(程序) ---》 硬盘 写入 输出流
硬盘 ---》 内存(程序) 读取 输入流
按照 数据流出方向来划分:
输出流
输入流
按照 处理的单位来进行划分
字节流 : 读取的数据是文件中的 二进制数据,不会对这个二进制数据进行任何的处理,直接以 二进制流的方式进行传输
字符流: 读取的数据是以字符为单位的。 字符串也是读取到这些二进制数据,然后它会把这些二进制数据转换为我们可以识别的字符。
字符流 = 字节流 + 解码
----------字节流
--------------输入流
----------------FileInputStream
----------------BufferedInputStream
--------------输出流
----------------FileOutputStream
----------------BufferedOutputStream
------------字符流
--------------输入流
--------------输出流
关于FileInputStream 输入字节流的用法
硬盘 ----》 读取数据 内存
使用步骤:
1.目标 (确定读取的 文件位置)
2.建立数据传输的 通道
3.读取文件中的 数据
4.关闭资源
输入字节流的用法
read(byte[] buff)
int read(byte[] b, int off, int len)
注意点: 要记住 关闭资源
如果读取完一个数据之后,没有关闭资源的话,那么在我们的程序 还没有退出的情况下, 其他程序无法对该资源进行操作
输出字节流 FileOutputStream
1.write(int b) ---》 这个方法是一次写入一个字节的数据
0000 0000 一个字节是8个位, 一个字节能够存储的最大整数 -128 ~ 127
如果我们写入的数据是333, 那么会出现什么问题?
77 --- 1001101
333 --- 10 1001101
333 这个数据的 高低位存储
0000 0000 0000 000 0000 0001 0100 1101
0100 1101 --> 77
当我们使用 FileOutputStream的 write(int b) 来写入数据的时候,接受的数据类型 虽然是 int类型
但是实际上 它只能给写出 一个 字节的数据(8个位的数据)
是把 int 类型的 低八位数据写出, 舍弃掉前面的24位数据。
2.使用FileOutputStream 类 来写入数据到 磁盘的时候, 如果指定的 目标文件 不存在,那么会自己创建这个目标文件。
3.使用FileOutputStream 类 来写入数据到 磁盘的时候, 如果指定的 目标文件 存在,那么写入的时候会先清空文件中原本的数据,然后再写入数据(会覆盖掉原本的内容)。
4.如果我们不想覆盖这个已经存在的文件中的内容,那么我们可以 用 FileOutputStream(File file, boolean append) 构造输出流对象。
字节输入流 和 字节输出流 的 应用
1.找到目标文件
(1)要读取的目标文件
(2)要写入的 这个目标文件的位置
2.建立数据传输的通道
(1)读取数据的通道
(2)写入数据的通道
3.操作数据(读取 和 写入)
在读取的过程中写入
一边读取一边写入
4.关闭资源(输出管理 和 输入管道 都关闭)
缓冲输入流
object
—— InputStream
——–FileInputStream BufferedInputStream
缓冲输出流
object
—— OutputStream
——–FileOutputStream BufferedOutputStream
因为 读取文件的数据,使用缓冲数组结合循环的方式,效率更高。
jdk的提供者 sun公司 也知道这个问题,因此,它提供了一个 缓冲输入字节流 ,来让我们更高效率的 读取文件
底层 实现: 它的底层是 维护了一个 8KB大小的 字节数组 来实现高效率的读取数据
使用步骤:
1.找到一个目标文件 (要读取的文件)
2.建立数据传输的通道
3.建立 缓冲输入字节流 对象 来读取数据
4.关闭资源
注意: 实际上 BufferedInputStream这个类的对象 本身并不具备 读取数据 和 关闭资源的能力, 是靠 构造这个对象时提供给他的值FileInputStream对象来实现的
缓冲输出字节流
BufferedOutputStream
8kb的缓冲数组
注意事项:
1、使用bufferdOutputStream 写数据的时候,它的 write方法 实际上是先把数据写到了它内部维护的 字节数组中, 没有马上写入到 磁盘中
2.(1)在它内部的 数据被填满了,它会自动的写入
(2)当你调用 flush()方法, 就相当于通知它 把数据写到磁盘中去
(3)当你调用close()方法,关闭资源的时候, 再也不会有数据写入了,也会立刻写数据到磁盘