23Java基础之File
File与IO的简介
有些数据想长久保存起来,该怎么办?

- 文件是非常重要的存储方式,在计算机硬盘中。
- 即便断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失。
1.File
- File是java.io包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件,或文件夹)。
![image]()
注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。
2.IO流
- 用于读写数据的(可以读写文件,或网络中的数据...)
File:代表文本
IO流:读写数据
File
- 创建File类的对象
![image]()
注意: - File对象既可以代表文件、也可以代表文件夹。
- File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的。
案例
//目标:掌握File对象的创建,来代表具体的文件。
public class FileDemo01 {
public static void main(String[] args) {
//1. 创建File对象
File f1 = new File("D:\\java_project\\resource\\test.jpg");
// File f1 = new File("D:/java_project/resource/test.jpg");
// File f1 = new File("E:" + File.separator + "java_project" + File.separator + "resource" + File.separator + "test.jpg");
System.out.println(f1.length());// 字节个数
//2. File对象可以代表文件,也可以代表文件夹。
File f2 = new File("D:\\java_project\\resource");
System.out.println(f2.length()); // 拿到的是文件夹本身的大小,不是里面全部内容的大小。
//3.File对象的文件路径可以是不存在的
File f3 = new File("E:\\a.txt");
// 以后可以创建出来
//4. File对象的路径可以支持绝对路径,相对路径。
// 什么是绝对路径:从盘符开始的路径。(依赖于当前操作系统,适合找特定系统的特定位置的文件)
File f4 = new File("D:\\java_project\\resource\\test.jpg");
// 什么是相对路径:相对于项目目录的路径。(重点)说白了不带盘符,直接到project(工程)下找文件。
// 一般是用来找项目中的资源文件的。很重要
File f5 = new File("day08-stream-file-io\\src\\test.jpg");
System.out.println(f5.length());
}
}
File提供的判断文件类型、获取文件信息功能

案例
//目标:掌握File提供的判断文件类型、获取文件信息功能
public class fileTest2 {
public static void main(String[] args) {
//1. 创建文件对象,指代某个文件
File f = new File("D:\\java_project\\resource\\test.jpg");
//2. 判断当前文件对象,对应的文件路径是否存在,存在返回ture
System.out.println(f.exists());
//3. 判断当前文件对象指代的是否是文件,是文件返回ture,反之返回false
System.out.println(f.isFile());
//4. 判断当前文件对象指代的是否是文件夹,是文件夹返回ture,反之返回false
System.out.println(f.isDirectory());
//5. 获取文件的名称(包含后缀)
System.out.println(f.getName());
//6. 获取文件大小,返回字节数
System.out.println(f.length());
//7. 获取文件的最后修改时间
long time = f.lastModified();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss EEE a");
// 将时间戳转换为带时区的日期时间对象
ZonedDateTime zonedDateTime = Instant.ofEpochMilli(time).atZone(ZoneId.systemDefault()); // 使用系统默认时区,也可指定如ZoneId.of("Asia/Shanghai")
// 格式化并输出
String formattedTime = dtf.format(zonedDateTime);
System.out.println(formattedTime);
//8. 获取创建文件对象时,使用的路径
System.out.println(f.getPath());
//9. 获取绝对路径
System.out.println(f.getAbsoluteFile());
// 找到真正的相对路径相对到哪里
File file = new File("");
System.out.println(file.getAbsoluteFile());
}
}
File类创建文件的功能

File类删除文件的功能

注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站。
案例
//目标:掌握File创建和删除文件的相关方法
public class fileTest3 {
public static void main(String[] args) throws IOException {
File f = new File("D:\\java_project\\resource\\b.txt");
//1. 创建一个新文件(文件内容为空),创建成功返回true,否则返回false
System.out.println(f.createNewFile());
//2. 创建文件夹,注意只能创建一级文件夹。创建成功返回true,否则返回false
File f2 = new File("D:\\java_project\\resource\\b\\asdf\\zzcv");
System.out.println(f2.mkdir());
//3.创建文件夹,可以创建多级文件夹(重点)
System.out.println(f2.mkdirs());
//4. 只能删除文件和空文件夹,不能删除非空文件夹
f.delete();
f2.delete();
}
}
File类提供的遍历文件夹的功能

案例
//目标:掌握File提供的遍历文件夹的方法
public class FileTest4 {
public static void main(String[] args) {
File f = new File("D:\\java_project\\resource");
String[] names = f.list();
for(String name: names){
System.out.println(name);
}
File[] files = f.listFiles();
for(File file: files){
System.out.println(file.getAbsoluteFile());
}
}
}
使用listFiles方法时的注意事项:
- 当主调是文件,或者路径不存在时,返回null。
- 当主调是空文件夹时,返回一个长度为0的数组。
- 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回,包含隐藏文件。
- 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件。
- 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null。
什么是方法递归?
- 递归是一种算法,在程序设计语言中广泛应用。
- 从形式上说:方法调用自身的形式称为方法递归(recursion)。
递归的形式
- 直接递归:方法自己调用自己。
- 间接递归:方法调用其他方法,其他方法又回调方法自己。
使用方法递归时需要注意的问题:
- 递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误。
案例
//目标:认识递归的形式
public class RecursionTest1 {
public static void main(String[] args) {
test1(); // 直接递归
test2(); // 间接递归
}
public static void test1(){
System.out.println("test1");
test1();
}
public static void test2(){
System.out.println("test2");
test3();
}
private static void test3() {
test2();
}
}
递归的案例-计算n的阶乘
需求:计算n的阶乘,5的阶乘=12345;6的阶乘是12345*6;
分析:
- 假如我们认为存在一个公式是f(n)=1234567...(n-1)n;
- 那么公式等价形式就是:f(n)=f(n-1)*n
- 如果求的是1-5的阶乘的结果,我们手工应该如果应用上述公式计算。
![image]()
//目标:递归的算法基础:解决求阶乘
public class RecursionTest2 {
public static void main(String[] args) {
System.out.println(getJieCheng(5));
}
public static int getJieCheng(int n){
if(n == 1) return 1;
return getJieCheng(n - 1)* n;//递归
}
}
递归算法三要素:
- 递归的公式:f(n)=f(n-1)*n;
- 递归的终结点:f(1)
- 递归的方向必须走向终结点:
![image]()
案例:猴子吃桃问题
- 猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个等到第10天的时候发现桃子只有1个了。
- 需求:请问猴子第一天摘了多少个桃子?
//目标:猴子吃桃问题
public class RecursionTest3 {
public static void main(String[] args) {
//1. 公式 f(x + 1) = f(x) - f(x)/2 -1;
// 变形:f(x) = 2f(x+1) + 2
//2. 终结点:f(10) = 1
//3. 递归的方向:f(1)= ?
System.out.println(f(1));
}
public static int f(int n){
if(n == 10) return 1;
return 2*f(n + 1) + 2;
}
}
案例:文件搜索
需求:从某个盘符下,搜索“QQ.exe”这个文件,找到后直接输出其位置。
//目标:文件搜索
public class RecursionTest4 {
public static void main(String[] args) throws IOException {
File dir = new File("E:\\");
searchFile(dir, "QQ.exe");
}
/**
* 搜索指定目录下的指定文件
* @param dir 要搜索的目录
* @param fileName 要搜索的文件
*/
private static void searchFile(File dir, String fileName) throws IOException {
//1. 极端判断
if(dir == null || !dir.exists() || dir.isFile()){
return;
}
//2. 搜索文件
// 提取当前目录下的全部一级文件对象
File[] files = dir.listFiles();
//3. 判断这个文件夹是否可以提取一级文件对象,以及是否存在一级文件对象,存在才可以搜索
if(files == null || files.length == 0) {
return;
}
//4. 遍历一级文件对象
for(File file: files){
if(file.isFile()){
//是文件
// 看看这个文件是否就是要查找的
if(file.getName().contains(fileName)){
System.out.println(file.getAbsolutePath());
//启动这个程序
Runtime r = Runtime.getRuntime();
r.exec(file.getAbsolutePath());
return;
}
}
else{
//是文件夹
// 递归搜索
searchFile(file, fileName);
}
}
}
}





浙公网安备 33010602011771号