目录
一、新建项目
二、IO流
1. 什么是IO流?
I 是 Input,O 是Output,也就是输入输出流。
当我们操作数据时,以内存为基准,把数据读取到内存中是输入,把数据从内存写入到硬盘是输出
2. IO的流向说明图解
图片来自哔哩哔哩黑马程序员
3. IO 流的分类
根据数据的流向可以分为:输入流和输出流
根据数据的类型可以分为:字节流和字符流
操作文件类型
字节流:以字节为单位,可以操作所有文件类型
字符流:以字符为单位,只能输入输出纯文本文件
4. 字节流
输出流
//1. 创建 FileOutputStream 对象,指定写入的文件路径。
FileOutputStream fos = new FileOutputStream("文件路径");
//2. 将字符串转换为字节数组并写入文件。
fos.write("hello".getBytes());
//3. 关闭输出流
fos.close();
字节输出流的细节
1.创建字节输出流的对象
- 参数是字符串表示的路径或者File文件对象都是可以的
- 如果文件不存在,就会创建一个新的文件,不过需要父级路径是正确的
- 如果文件已经存在,会覆盖原文件
2.写数据
是根据字节对应的ASCII码表
3.关闭数据流
追加
在创建字节输出流的对象的时候,第二个参数是打开追加
输入流
//1. 创建 FileInputStream 对象,指定读取的文件路径。
FileInputStream fis = new FileInputStream("文件路径");
//每次只会读取一个字节,读取出来的是int型,需要转成Char类型
System.out.println((char)fis.read());
//释放资源
fis.close();
字节输入流的细节
1. 创建对象
如果指定的路径文件不存在,会字节报错
2. 读取内容
一次只会读取一个字节,读取的是ASCII码表对应的数值
当读取指针指到末尾没有内容了,会返回-1
3. 释放资源
5. 练习
拷贝文件
当使用一个字节一个字节来读取数据,再写入数据的方式,速度比较慢
所以,可以定义一个数组,一次读取尽量把数组装满,一次写入整个数组的数量
FileInputStream fis = new FileInputStream(要读取的文件路径);
FileOutputStream fos = new FileOutputStream(要写入的文件路径);
//创建一个数组,用来一次读取多少字节
byte [] buf = new byte[1024*1024*10];
int b;
while ((b = fis.read(buf)) != -1) {
fos.write(buf, 0, b); //第一个参数表示将buf数组里的数据写入到文件里
} //第二个参数是从 0 索引开始,写入的字节数是 b
fis.close();
fos.close();
解读代码
fis.read(buf)用于从输入流中读取数据到缓冲区buf,返回值b表示实际读取到的数据字节数。当读取到的数据为-1时,表示输入流已经到达末尾,循环结束。
fos.write(buf, 0, b)则用于将缓冲区中的数据写入到输出流中,写入的字节数为b。
6. 字符流
输入流
//创建字符流对象
FileReader fr = new FileReader("要读取的文件路径");
int ch;
//字符流的底层也是字节流,默认也是一次读取一个字节
while ( (ch = fr.read() ) != -1){
System.out.print( (char) ch); //读取出来后会自动解码然后转成十进制
} /