第3章 File类

📅 2026/7/6 21:19:47
第3章 File类
一、File介绍File类创建对象和路径的分类public File(String pathname) 根据文件路径创建文件对象 ​ public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象 ​ public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象File封装的对象仅仅是一个路径名这个路径可以是存在的也可以是不存在的当磁盘根目录不存在如F盘不存在时抛出异常两个反斜杠是路径一个反斜杠代表转义package com.itheima.file; ​ import java.io.File; import java.io.IOException; ​ public class FileDemo1 { /* File类的常用构造方法 ​ public File(String pathname) 根据文件路径创建文件对象 public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象 public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象 */ public static void main(String[] args) throws IOException {//当磁盘根目录不存在如F盘不存在时抛出异常 File f1 new File(E:\\A.txt);//两个反斜杠是路径一个反斜杠代表转义 System.out.println(f1.exists());//存在则返回为True不存在则返回False ​ File f2 new File(E:\\Develop); System.out.println(f2.exists()); ​ File f3 new File(E:\\,Develop); System.out.println(f3.exists()); ​ File f4 new File(new File(E:\\),Develop); System.out.println(f4.exists()); ​ File f5 new File(E:\\B.txt); f5.createNewFile();//创建该对象所指定的文件 } }绝对路径: 从盘符根目录开始一直到某个具体的文件或文件夹 E:\A.txt E:\Develop相对路径: 相对于当前项目package com.itheima.file; ​ import java.io.File; import java.io.IOException; ​ public class FileDemo2 { /* 绝对路径: 从盘符根目录开始一直到某个具体的文件或文件夹 E:\\A.txt E:\\Develop ​ 相对路径: 相对于当前项目 */ public static void main(String[] args) throws IOException { File f1 new File(A.txt); f1.createNewFile(); ​ File f2 new File();//为了获取项目路径 System.out.println(f2.getAbsoluteFile());//获取绝对路径 ​ File f3 new File(day03\\A.txt); f3.createNewFile(); } }二、File类的常用API1、判断相关的方法public boolean isDirectory() 判断此路径名表示的File是否为文件夹 public boolean isFile() 判断此路径名表示的File是否为文件 public boolean exists() 判断此路径名表示的File是否存在package com.itheima.file; ​ import java.io.File; ​ public class FileDemo3 { /* File类的判断相关方法 ​ public boolean isDirectory() 判断此路径名表示的File是否为文件夹 public boolean isFile() 判断此路径名表示的File是否为文件 public boolean exists() 判断此路径名表示的File是否存在 */ public static void main(String[] args) { ​ File f new File(day03\\A.txt); ​ System.out.println(f.isDirectory()); System.out.println(f.isFile()); System.out.println(f.exists()); ​ } }案例package com.itheima.test; ​ import java.io.File; import java.util.Scanner; ​ public class FileTest1 { /* 需求: 键盘录入一个文件夹路径如果输入错误就给出提示并继续录入直到正确为止 ​ 分析: 1. 输入的路径有可能不存在 2. 输入的路径有可能是文件路径 ​ 封装为File对象 调用 exists() 判断是否存在 调用 isFile() 判断是否是文件 ​ */ public static void main(String[] args) { ​ File dir getDir(); System.out.println(dir); ​ } ​ public static File getDir() { Scanner sc new Scanner(System.in); while (true) { System.out.println(请输入一个文件夹路径: ); String dir sc.next(); ​ File file new File(dir); ​ if (!file.exists()) { System.out.println(您输入的文件夹路径不存在, 请检查!); } else if (file.isFile()) { System.out.println(您输入的是一个文件路径, 请重新输入文件夹路径: ); } else { return file; } } } }2、获取相关的方法public long length() 返回文件的大小字节数量 注意: 如果是文件夹对象, 调用该方法, 返回的结果是错误的. public String getAbsolutePath() 返回文件的绝对路径 public String getPath() 返回定义文件时使用的路径 public String getName() 返回文件的名称带后缀 public long lastModified() 返回文件的最后修改时间时间毫秒值 package com.itheima.file; ​ import java.io.File; import java.util.Date; ​ public class FileDemo4 { /* File类常用方法: ​ public long length() 返回文件的大小字节数量 注意: 如果是文件夹对象, 调用该方法, 返回的结果是错误的. public String getAbsolutePath() 返回文件的绝对路径 public String getPath() 返回定义文件时使用的路径 public String getName() 返回文件的名称带后缀 public long lastModified() 返回文件的最后修改时间时间毫秒值 */ public static void main(String[] args) { File f1 new File(E:\\A.txt);//返回文件的大小字节数量 System.out.println(f1.length()); ​ File f2 new File(E:\\Develop);//如果是文件夹对象, 调用该方法, 返回的结果是错误的. System.out.println(f2.length()); ​ File f3 new File(day03\\A.txt);//返回文件的绝对路径 System.out.println(f3.getAbsolutePath()); ​ System.out.println(f2.getPath());//返回定义文件时使用的路径 System.out.println(f3.getPath()); ​ System.out.println(f3.getName());//返回文件的名称带后缀 ​ long time f1.lastModified();//返回文件的最后修改时间时间毫秒值 System.out.println(time); ​ Date d new Date(time); System.out.println(d); } }3、创建和删除的方法public boolean createNewFile() 创建一个新的空的文件 public boolean mkdir() 只能创建一级文件夹 public boolean mkdirs() 可以创建多级文件夹 public boolean delete() 删除由此抽象路径名表示的文件或空文件夹只能删除空文件夹且不走回收站package com.itheima.file; import java.io.File; import java.io.IOException; public class FileDemo5 { /* File类常用方法: 创建和删除 public boolean createNewFile() 创建一个新的空的文件 public boolean mkdir() 只能创建一级文件夹 public boolean mkdirs() 可以创建多级文件夹 public boolean delete() 删除由此抽象路径名表示的文件或空文件夹只能删除空文件夹且不走回收站 */ public static void main(String[] args) throws IOException { File f1 new File(day03\\B.txt); System.out.println(f1.createNewFile()); File f2 new File(day03\\aaa); System.out.println(f2.mkdirs()); System.out.println(f1.delete()); System.out.println(f2.delete()); } }4、遍历的方法public File[] listFiles() //获取当前目录下所有的 “一级文件对象” 返回 File 数组package com.itheima.test; import java.io.File; public class FileTest2 { /* 需求键盘录入一个文件夹路径找出这个文件夹下所有的 .java 文件 public File[] listFiles() 获取当前目录下所有的 “一级文件对象” 返回 File 数组 */ public static void main(String[] args) { File dir FileTest1.getDir(); printJavaFile(dir); } private static void printJavaFile(File dir) { // 1. 获取当前文件夹下所有的文件和文件夹对象 File[] files dir.listFiles(); // 2. 遍历数组, 获取每一个文件和文件夹对象 for (File file : files) { // 3. 判断当前对象是否是文件, 并且是java文件 if(file.isFile() file.getName().endsWith(.java)){ // 4. 打印在控制台 System.out.println(file); } } } }三、递归介绍package com.itheima.recursion; public class RecursionDemo1 { /* 递归: 方法直接或者间接调用本身 递归如果没有控制好终止会出现递归死循环导致栈内存溢出现象 */ public static void main(String[] args) { methodA(); } public static void methodA() { methodB(); } public static void methodB() { methodC(); } public static void methodC() { methodA(); } }1、递归求阶乘package com.itheima.recursion; public class RecursionDemo2 { /* 需求: 使用递归求5的阶乘 5的阶乘5!: 5 * 4 * 3 * 2 * 1 5的阶乘5!: 5 * 4! 4的阶乘4!: 4 * 3! 3的阶乘3!: 3 * 2! 2的阶乘2!: 2 * 1! 1的阶乘1!: 1 */ public static void main(String[] args) { System.out.println(jc(5)); } public static int jc(int num) { if (num 1) { return 1; } else { // 思路: 需要调用一个方法, 获取4的阶乘 // 5 * jc(4) // 4 * jc(3) // ... return num * jc(num - 1); } } }递归求阶乘图解四、递归案例1、不死神兔斐波那契数列package com.itheima.test; public class RecursionTest { /* 有一对兔子从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子假如兔子都不死问第二十个月的兔子对数为多少 规律: 从第三个月开始兔子的对数是前两个月相加的和 */ public static void main(String[] args) { System.out.println(get(20)); } public static int get(int month) { // 第一个, 第二个月兔子的对数为1 if (month 1 || month 2) { return 1; } else { // 第三个月: 第一个月 第二个月 month 3 // 第四个月: 第二个月 第三个月 month 4 // ... return get(month - 2) get(month - 1); } } }2、找出文件夹下所有Java文件listFiles的注意事项当调用者File表示的路径不存在时返回null 当调用者File表示的路径是文件时返回null 当调用者File表示的路径是一个空文件夹时返回一个长度为0的数组 当调用者File表示的路径是需要权限才能访问的文件夹时返回nullpackage com.itheima.test; import java.io.File; public class FileTest3 { /* 需求键盘录入一个文件夹路径找出这个文件夹下所有的 .java 文件 (考虑子文件夹) */ public static void main(String[] args) { File dir FileTest1.getDir(); printJavaFile(dir); } private static void printJavaFile(File dir) { // 获取当前目录下, 所有文件和文件夹对象 File[] files dir.listFiles(); // 遍历数组, 获取每一个文件和文件夹对象 for (File file : files) { // 如果是文件, 并且是.java文件, 就打印在控制台 if (file.isFile() file.getName().endsWith(.java)) { System.out.println(file); } else if (file.isDirectory()) { // 说明是文件夹, 进入这个文件夹, 继续查找.java文件 // 思路: 需要调用一个方法, 进入文件夹查找.java文件, 发现自己这个方法就是解决此问题, 递归调用. if (file.listFiles() ! null) { printJavaFile(file); } } } } }3、删除文件夹package com.itheima.test; import java.io.File; public class FileTest4 { /* 需求 : 设计一个方法, 删除文件夹 注意 : delete() 只能删除空文件夹 */ public static void main(String[] args) { File dir new File(E:\\test); deleteDir(dir); } private static void deleteDir(File dir) { File[] files dir.listFiles(); for (File file : files) { if (file.isFile()) { file.delete(); } else { if (file.listFiles() ! null) {//健壮性避免空指针异常 deleteDir(file); } } } dir.delete();//删完里面所有的文件之后再删除空文件夹 } }4、统计文件夹大小package com.itheima.test; ​ import java.io.File; ​ public class FileTest5 { /* 需求: 键盘录入一个文件夹路径统计文件夹的大小 */ public static void main(String[] args) { File dir FileTest1.getDir(); ​ long length getDirLength(dir); ​ System.out.println(字节数量为: length); } ​ private static long getDirLength(File dir) { long result 0; File[] files dir.listFiles(); for (File file : files) { if (file.isFile()) { result file.length(); } else { if (file.listFiles() ! null) { result getDirLength(file); } } } return result; } }