Java—— File详解
说明
File对象就表示一个路径,可以是文件的路径、也可以是文件夹的路径
这个路径可以是存在的,也允许是不存在的
获取File对象
方法名称 | 说明 |
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent,String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
public File(File parent,String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
代码演示
import java.io.File;public class Test1 {public static void main(String[] args) {//根据文件路径创建文件对象File f1 = new File("D:\\aaa\\a.txt");System.out.println(f1);//D:\aaa\a.txt//根据父路径名字符串和子路径名字符串创建文件对象String parent = "D:\\aaa";String child = "a.txt";File f2 = new File(parent, child);System.out.println(f2);//D:\aaa\a.txt//根据父路径对应文件对象和子路径名字符串创建文件对象File f3 = new File("D:\\aaa");File f4 = new File(f3, "a.txt");System.out.println(f4);//D:\aaa\a.txt}
}
File的常见成员方法
判断、获取
方法名称 | 说明 |
public boolean isDirectory() | 判断此路径名表示的File是否为文件夹 |
public boolean isFile() | 判断此路径名表示的File是否为文件 |
public boolean exists() | 判断此路径名表示的File是否存在 |
public long length() | 返回文件的大小(字节数量) |
public string getAbsolutePath() | 返回文件的绝对路径 |
public String getPath() | 返回定义文件时使用的路径 |
public String getName() | 返回文件的名称,带后缀 |
public long lastModified() | 返回文件的最后修改时间(时间毫秒值) |
代码演示
下面代码中涉及到的存在的文件及文件夹:
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test2 {public static void main(String[] args) {//判断此路径名表示的File是否为文件夹,是否为文件,是否存在//对于一个存在的文件File f1 = new File("D:\\aaa\\a.txt");System.out.println(f1.isDirectory());//falseSystem.out.println(f1.isFile());//trueSystem.out.println(f1.exists());//true//对于一个存在的文件夹File f2 = new File("D:\\aaa\\bbb");System.out.println(f2.isDirectory());//trueSystem.out.println(f2.isFile());//falseSystem.out.println(f2.exists());//true//对于一个不存在的文件File f3 = new File("D:\\aaa\\c.txt");System.out.println(f3.isDirectory());//falseSystem.out.println(f3.isFile());//falseSystem.out.println(f3.exists());//false//对于一个不存在的文件夹File f4 = new File("D:\\aaa\\ccc");System.out.println(f4.isDirectory());//falseSystem.out.println(f4.isFile());//falseSystem.out.println(f4.exists());//false//返回文件的大小(字节数量)//可以通过将文件夹中的文件的大小累加起来算出文件夹的大小File f5 = new File("D:\\aaa\\a.txt");System.out.println(f5.length());//518//返回文件的绝对路径//即使传递的是相对路径,返回的也是绝对路径File f6 = new File("day04\\a.txt");System.out.println(f6.getAbsolutePath());//D:\JavaCode\csdn\day04\a.txt//返回定义文件时使用的路径//定义文件时使用相对路径就返回相对路径//定义文件时使用绝对路径就返回绝对路径File f7 = new File("day04\\a.txt");System.out.println(f6.getPath());//day04\a.txt//返回文件的名称,带后缀File f8 = new File("D:\\aaa\\a.txt");System.out.println(f8.getName());//a.txt//返回文件的最后修改时间(时间毫秒值)File f9 = new File("D:\\aaa\\a.txt");long time = f9.lastModified();System.out.println(time);//1747640455223//可以将其解析为字符串形式Date d = new Date(time);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String timeStr = sdf.format(d);System.out.println(timeStr);//2025-05-19 15:40:55}
}
创建、删除
方法名称 | 说明 |
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 创建单级文件夹 |
public boolean mkdirs() | 创建多级文件夹 |
public boolean delete() | 删除文件、空文件夹 |
代码演示
import java.io.File;
import java.io.IOException;public class Test3 {public static void main(String[] args) throws IOException {//创建一个新的空的文件//细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true// 如果当前路径表示的文件是存在的,则创建失败,方法返回false//细节2:如果父级路径是不存在的,那么方法会有异常IOException//细节3:创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件File f1 = new File("D:\\aaa\\a.txt");boolean flag1 = f1.createNewFile();//创建单级文件夹File f2 = new File("D:\\aaa\\bbb");boolean flag2 = f2.mkdir();//创建多级文件夹//可以在要创建的文件夹里再创建文件夹File f3 = new File("D:\\aaa\\ccc\\ddd");boolean flag3 = f3.mkdirs();//创建多级文件夹的方法也能创建单级文件夹//创建多级文件夹方法的底层就是创建单级文件夹的方法//删除文件、空文件夹//如果删除的是文件,则直接删除,返回true,不走回收站。//如果删除的是空文件夹,则直接删除,返回true,不走回收站//如果删除的是有内容的文件夹,则删除失败,返回false。File f4 = new File("D:\\aaa\\a.txt");boolean flag4 = f4.delete();}
}
获取并遍历
核心方法
方法名称 | 说明 |
public File[] listFiles() | 获取当前该路径下所有内容 |
注意事项:
1. 当调用者File表示的路径不存在时,返回null
2. 当调用者File表示的路径是文件时,返回null
3. 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
4. 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
5. 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
6. 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
代码演示
下面代码中涉及到的文件及文件夹:
import java.io.File;public class Test4 {public static void main(String[] args) {//public File[] listFiles() 获取当前该路径下所有内容File f = new File("D:\\aaa");File[] files = f.listFiles();for (File file : files) {System.out.println(file);}//D:\aaa\a.txt//D:\aaa\aaa//D:\aaa\b.txt//D:\aaa\bbb//D:\aaa\c.txt}
}
其他方法
方法名称 | 说明 |
public static File[] listRoots() | 列出可用的文件系统根 |
public String[] list() | 以字符串形式获取当前该路径下所有内容 |
public String[] list(FilenameFilter filter) | 利用文件名过滤器获取 |
public File[] listFiles(FileFilter filter) | 利用文件名过滤器获取 |
public File[] listFiles(FilenameFilter filter) | 利用文件名过滤器获取 |
代码演示
下面代码中涉及到的文件及文件夹:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Arrays;public class Test5 {public static void main(String[] args) {//列出可用的文件系统根File[] files1 = File.listRoots();for (File file : files1) {System.out.println(file);}//C:\//D:\File f1 = new File("D:\\aaa");//以字符串形式获取当前该路径下所有内容String[] arr1 = f1.list();System.out.println(Arrays.toString(arr1));//[a.txt, aaa, b.txt, bbb, c.txt]//利用文件名过滤器获取//list(FilenameFilter filter)//返回String[]//accept方法的形参依次表示aaa文件夹里面每一个文件或者文件夹的路径//参数一:父级路径//参数二:子级路径//返回值:如果返回值为true,就表示当前路径保留//如果返回值为false,就表示当前路径舍弃不要//若只想保留txt文件,则:String[] arr2 = f1.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {File f = new File(dir, name);return f.isFile() && name.endsWith(".txt");}});System.out.println(Arrays.toString(arr2));//[a.txt, b.txt, c.txt]//listFiles(FileFilter filter)//返回File[]//accept方法的形参依次表示aaa文件夹里面每一个文件或者文件夹的完整路径File[] files2 = f1.listFiles(new FileFilter() {@Overridepublic boolean accept(File pathname) {return pathname.isFile() && pathname.getName().endsWith(".txt");}});//listFiles(FilenameFilter filter)//返回File[]//accept方法的形参依次表示aaa文件夹里面每一个文件或者文件夹的路径//参数一:父级路径//参数二:子级路径File[] files3 = f1.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {File f = new File(dir, name);return f.isFile() && name.endsWith(".txt");}});for (File file : files3) {System.out.println(file);}//D:\aaa\a.txt//D:\aaa\b.txt//D:\aaa\c.txt}
}
案例练习
练习涉及的文件路径如图所示
利用递归的思想查找文件
查找上述文件路径中所有的txt文件
import java.io.File;public class Test6 {public static void main(String[] args) {File f = new File("D:\\src");findTXT(f);//D:\src\a.txt//D:\src\aaa\a.txt//D:\src\b.txt//D:\src\bbb\b.txt}//定义方法解析查找public static void findTXT(File f){//进入文件夹,依次遍历该文件夹的内容File[] files = f.listFiles();for (File file:files){//判断是否为文件if (file.isFile()){//是文件,判断是否是txt文件if(file.getName().endsWith(".txt")){//是就输出System.out.println(file);}}else{//是文件夹,进行递归,查找该文件夹里的txt文件findTXT(file);}}}
}
利用递归的思想计算文件夹的大小
因为length方法只能得到文件的大小,所以可以使用递归,遇到文件夹就累加其中文件的大小并返回
import java.io.File;public class Test7 {public static void main(String[] args) {File f = new File("D:\\src");long length = getLength(f);System.out.println(length);//77028}//定义方法计算文件夹的大小public static long getLength(File f) {long length = 0L;//进入文件夹,依次遍历该文件夹的内容File[] files = f.listFiles();for (File file : files) {//判断是否为文件if (file.isFile()) {//是文件,累加文件的大小length = length + file.length();} else {//是文件夹,进行递归,累加该文件夹里的文件大小length = length + getLength(file);}}return length;}
}
利用递归的思想删除有内容的文件夹
因为有内容的文件夹不可以用delete进行删除,所以可以使用递归将文件夹里的内容删除,再删除空文件夹
import java.io.File;public class Test8 {public static void main(String[] args) {File f = new File("D:\\src");myDelete(f);}//定义方法删除文件夹public static void myDelete(File f) {//进入文件夹,依次遍历该文件夹的内容File[] files = f.listFiles();for (File file : files) {//判断是否为文件if (file.isFile()) {//是文件,直接删除file.delete();} else {//是文件夹,进行递归,删除该文件夹myDelete(file);}}//走到这步,说明文件夹中的内容已被删除//可以删除空文件夹f.delete();}
}