课程笔记Day18
- File类
- IO流
第一章 File类
第01节 基础理论
File类是什么呢?
关于 文件 和 文件夹的操作。
举例:
1. 新建文件夹
2. 删除文件夹
3. 移动文件夹
4. 查看文件夹的内容
5. 新建文件
6. 删除文件
7. 修改文件
8. 查看文件信息
第02节 常用方法
构造方法
创建对象格式 | 格式说明 |
---|---|
File f1 = new File(“文件或者文件夹的路径”); | 将路径字符串,直接封装成为 File 对象 |
File f2 = new File(“父文件夹的路径”, “文件或文件夹的路径”); | 将父文件夹路径和子文件或子文件夹路径,拼接成为File对象 |
File f3 = new File(file对象,“子文件或文件夹的路径”); | 将file对象和子文件或子文件夹路径,拼接成为File对象 |
常用方法
1. 新增功能:
A. boolean createNewFile() //创建文件
B. boolean mkdir() //创建单级文件夹
C. boolean mkdirs() //创建多级文件夹
2. 删除功能:
A. boolean delete() //删除文件或者空文件夹
3. 查询功能:
A. boolean exists() //判断文件或者文件夹是否存在
B. boolean isDirectory() //判断是否是文件夹
C. boolean isFile() //判断是否是文件
D. String getName() //获取文件的名称
E. String getPath() //获取构造方法的路径
F. String getAbsolutePath() //获取绝对路径
G. File[] listFiles() //获取子文件的对象数组
概念两个路径
1. 相对路径
A. 含义: 不包含盘符的路径。如果在idea当中,则相对于项目路径(省略了项目路径不写)
B. 例如: "JavaSEDay18\\abc\\def\\A.txt" ---》 相当于在 项目路径\\JavaSEDay18\\abc\\def\\A.txt
C. 例如: 定浩坐在什么地方?
D8存在研发八部的川哥旁边。
D10存在研发八部的川哥旁边。
2. 绝对路径
A. 含义: 包含盘符的路径。
B. 例如: C:\develop\workspace\java210712\JavaSEDay18\abc\def\A.txt
C. 例如: 定浩坐在什么地方?
宇宙、银河系、太阳系、地球、亚洲、中国、湖北、xxx、D8存在研发八部的川哥旁边。
listFiles注意事项
1. 如果文件对象是 文件,采用 listFiles() 方法,得到的结果是:返回值是 null
2. 如果文件对象是 空文件夹,采用 listFiles() 方法,得到的结果是: 返回值是 长度为0的数组
3. 如果文件对象是 不存在的,采用 listFiles() 方法,得到的结果是:返回值是 null
4. 如果文件对象是 系统权限文件夹,采用 listFiles() 方法,得到的结果是:返回值是 null
第03节 递归遍历文件夹
思路
代码
import java.io.File;
import java.util.ArrayList;
import java.util.List;
//递归遍历文件夹,将文件夹和文件的信息,打印输出在控制台当中
@SuppressWarnings("all")
public class Test07 {
public static void main(String[] args) {
//准备数据
File f = new File("JavaSEDay18\\dir");
List<File> dirList = new ArrayList<>();
List<File> fileList = new ArrayList<>();
//直接调用方法
diGui(f,dirList,fileList);
//查看结果
System.out.println("文件夹的数据如下:");
//采用lambda表达式快速遍历集合。里面使用方法引用
dirList.forEach(System.out::println);
System.out.println("--------------");
System.out.println("文件的数据如下:");
//采用lambda表达式快速遍历集合。里面使用方法引用
fileList.forEach(System.out::println);
}
//定义一个递归操作的方法
public static void diGui(File f, List<File> dirList, List<File> fileList){
//1. 判断,如果是文件,则直接存放到集合当中
if (f.isFile()){
fileList.add(f);
}
//2. 判断,如果是文件夹,则直接存放到文件夹的集合。还需要得到子文件数组,遍历递归
if (f.isDirectory()){
dirList.add(f);
//------------------
//获取到亲儿子 子文件的对象数组
File[] array = f.listFiles();
//判断当前的数组是否不为空,防止空指针异常的问题
if (array!=null){
//增强for,获取到每一个儿子
for (File child : array) {
//再次获取文件和文件夹,递归操作
diGui(child,dirList,fileList);
}
}
//------------------
}
}
}
第二章 IO流
第01节 基础理论
IO流
从流向划分
1. I: in 输入(从硬盘到内存的过程) 从电脑文件到 Java程序的过程 //键盘、鼠标、扫描仪
2. O: out 输出(从内存到硬盘的过程) 从Java程序到 电脑文件的过程 //显示器、打印机
从数据划分
1. 字节流(byte) 操作的是 0或者1数据。 InputStream 和 OutputStream 任何数据都可以使用字节流
2. 字符流(char) 操作的是 中午、英文、符号等字符数据。 Reader 和 Writer 文本类型的数据(可以解决中文乱码问题)
第02节 FileOutputStream
构造方法:
方法API | 方法说明 |
---|---|
FileOutputStream(String) | 参数1:文件的路径 |
FileOutputStream(String,boolean) | 参数1:文件的路径 参数2:是否开启追加写,默认false |
FileOutputStream(File) | 参数1:文件的对象 |
FileOutputStream(File,boolean) | 参数1:文件的对象 参数2:是否开启追加写,默认false |
1. 如果构造方法参数当中,文件不存在,则创建文件 2. 如果构造方法参数当中,文件夹不存在,则出现异常 FileNotFoundException 3. 如果构造方法参数当中,文件存在,而且文件当中有内容,创建对象的时候,会创建新的文件,覆盖之前的文件。
常用方法:
方法API | 方法说明 |
---|---|
void write(int) | 参数1:写入的字节数据 |
void write(byte[]) | 参数1:写入的字节数组数据 |
void write(byte[],int,int) | 参数1:写入的字节数组数据,参数2:开始索引,参数3:写几个数据 |
void close() | 这里的 close()方法表示断开和操作系统之间的关联关系 |
注意:释放资源一旦使用完毕,后面将不能继续调用 write()方法
第03节 FileInputStream
构造方法:
方法API | 方法说明 |
---|---|
FileInputStream(String) | 参数1:文件的路径 |
FileInputStream(File) | 参数1:文件的对象 |
常用方法:
方法API | 方法说明 |
---|---|
int read() | 一次读取一个字节,返回字节数据 |
int read(byte[]) | 一次读取一个字节数组,返回读取的字节数组有效长度 |
int read(byte[],int,int) | 一次读取一个字节数组一部分,返回读取的字节数组长度 |
void close() | 释放资源,断开文件与程序之间的联系 |
第04节 文件复制案例
文件复制案例(一次一字节)
文件复制(一次一字节数组)
第05节 字节缓冲流
案例一:采用字节缓冲流一次读写一个字节复制文件
//字节缓冲流 一次一字节 复制文件
@SuppressWarnings("all")
public class Test01 {
public static void main(String[] args) throws IOException {
String srcPath = "JavaSEDay18\\dir\\图片1.png";
String destPath = "JavaSEDay18\\dir\\目标图片3.png";
//1. 创建对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcPath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
//2. 读写数据
int ch;
while((ch = bis.read())!=-1){
bos.write(ch);
}
//3. 释放资源
bis.close();
bos.close();
}
}
案例二:采用字节缓冲流一次读写一个字节数组复制文件
//字节缓冲流 一次一字节数组 复制文件
@SuppressWarnings("all")
public class Test02 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis(); //开始时间,距离1970年1月1号 00:00:00 毫秒值
String srcPath = "JavaSEDay18\\dir\\图片1.png";
String destPath = "JavaSEDay18\\dir\\目标图片4.png";
//1. 创建对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcPath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
//2. 读写数据
byte[] array = new byte[1024];
int len;
while ((len = bis.read(array))!=-1){
bos.write(array,0,len);
}
//3. 释放资源
bis.close();
bos.close();
long end = System.currentTimeMillis(); //结束时间,距离1970年1月1号 00:00:00 毫秒值
System.out.println(end-start);
}
}