文字数:约1600字 阅读时间:30分钟
IO是两个单词的缩写,I(Input输入)O(Output输出)
1) 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output 操作。
2) 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input 操作。
3) 因此我们把这种输入和输出动作称为 IO 操作。
IO流是专门用来操作文件中的内容,可以将程序中(内存中)的数据写到硬盘中,也可以从硬盘上读一些数据到程序中(内存中)
1) 在计算机的硬盘上存在的任意数据,最终的体现形式都是字节
2) 一个0或一个1就是一个比特位,简称位,八个比特位是一个字节
3) 计算机硬盘保存数据的最小单位是字节
IO流概念理解图:
3.1.1 字节输入流 InputStream 抽象类
1. 介绍
字节输入流的所有类的超类,这里面的方法都是通用方法
2. 共性方法
read() :从输入流中读取数据的下一个字节。(返回值为读取到的这个字节的ASCII码值)
read(byte[] b) :从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
read(byte[] b, int off, int len) :将输入流中最多 len 个数据字节读入 byte 数组。(
off表示数组可以从哪个索引开始使用
len表示可以使用的个数
返回值是b中保存的有效字节的个数
)
close() :关闭此输出流并释放与此流有关的所有系统资源。
3. 普通字节输入流FileInputStream
3.1 介绍
1) InputStream的子类
2) 从文件系统中的某个文件中获得输入字节
3.2 构造方法
FileInputStream(File file) :通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
4. 字节缓冲输入流 BufferedInputStream
4.1 缓冲流介绍
就是自带了一个缓冲区,可以提升IO流读写的效率
4.2 构造方法
1) BufferedInputStream(InputStream in) :创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
2) 依然使用顶层超类的方法
3.1.2 字节输出流 OutputStream 抽象类
1. 介绍
表示字节输出流的所有类的超类,这里面的方法都是通用方法
2. 共性方法
close() :关闭此输出流并释放与此流有关的所有系统资源。
flush() : 刷新此输出流并强制写出所有缓冲的输出字节。
write(byte[] b) :将 b.length 个字节从指定的 byte 数组写入此输出流。
write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
write(int b) :将指定的字节写入此输出流。 (b就是一个字节的码值(人为的规定了一个数字代表着一个符号,保存这些规定的表称为ASCII码表,这个数值称为ASCII码值))
3. 普通字节输出流FileOutputStream
3.1 介绍
1) 是OutPutStream的子类
2) 文件输出流,是用于操作硬盘上数据的输出流对象。
3.2 构造方法
1) FileOutputStream(File file) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流
2) FileOutputStream(String name) :创建一个向具有指定名称的文件中写入数据的文件输出流
3) 续写构造
1. 希望在创建输出流对象的时候不要删除原文件,不删除原文件并且在原先文件的基础上进行续写的话,需要选择带布尔类型参数的构造方法,写成true,默认不写为false
2. FileOutputStream(String name, boolean append) :创建一个向具有指定 name 的文件中写入数据的输出文件流
3. FileOutputStream(File file, boolean append) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流
4. 字节缓冲输出流 BufferedOutputStream
4.1 缓冲流介绍
就是自带了一个缓冲区,可以提升IO流读写的效率
4.2 构造方法
BufferedOutputStream(OutputStream out) :创建一个新的缓冲输出流,以将数据写入指定的底层输出流
4.3 依然使用顶层超类的方法
3.1.3 涉及到的方法
1. String
1) getBytes():将一个字符串转换成一个对应字节数组
2) String(byte[] bytes, int offset, int length) :通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。(
bytes里存的是需要解码的字节码值
offset是开始的索引
length是需要解码的个数
)
1) 按照字符的方式读写
仅能操作文本类型的文件
2) 按照字节的方式读写
万能流(可以操作任意类型的文件)
1) 字节输入流与字节输出流,逐字节循环读写
FileOutputStream fos = new FileOutputStream("a.txt");
FileInputStream fis = new FileInputStream("b.txt");
int i = -1;
while((i=fis.read())!=-1) {
fos.write(i);
}
fos.close();
fis.close();
2) 字节输入流与字节输出流,使用字节数组循环读写
FileOutputStream fos = new FileOutputStream("a.txt");
FileInputStream fis = new FileInputStream("b.txt");
byte[] barr = new byte[1024];
int len = 0;
while((len=fis.read(barr))!=-1) {
fos.write(barr,0,len);
}
fos.close();
fis.close();
3) 缓冲字节输入流与缓冲字节输出流,逐字节循环读写
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("b.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
int len = -1;
while((len=bis.read())!=-1) {
bos.write(len);
}
bos.close();
bis.close();
4) 缓冲字节输入流与缓冲字节输出流,使用字节数组循环读写
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("b.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
byte[] barr = new byte[1024];
int len = 0;
while((len=bis.read(barr))!=-1) {
bos.write(barr,0,len);
}
bos.close();
bis.close();
1) 缓冲流加数组效率最高
2) 基本流加数组次之
3) 缓冲流逐字节次之
4) 基本流逐字节最慢