Java基础快速入门: File类与IO流基础 本文纲要File和IO概述File类的构造方法绝对路径与相对路径File的创建功能File的删除方法File的判断与获取方法File的高级获取方法listFiles项目代码结构综合练习练习1在指定目录中创建文件练习2递归删除多级文件夹练习3统计文件夹中每种文件出现的次数File和IO概述在Java中我们经常需要对硬盘上的文件进行读写操作实现数据的永久化存储。例如保存用户配置、导出报表、日志记录等。回想一下使用变量、数组或集合存储数据当程序运行结束后所有数据都会丢失。而借助硬盘这一硬件我们可以在程序退出后依然保留数据。在操作系统中我们通常对硬盘进行读和写两种操作但在读写之前必须先知道文件在哪儿。IO流负责将数据从本地文件读取到内存或者将内存中的数据写入本地文件实现永久存储。File类用于描述要操作的文件或文件夹的路径同时也能对文件/文件夹本身进行创建、删除等操作。简言之File定位文件位置IO流负责读写数据。File类的构造方法java.io.File类是文件和目录路径名的抽象表示。它封装的对象可以是存在的路径也可以是不存在的路径。学习一个类先从构造方法开始。File 提供了三种常用构造构造方法说明File(String pathname)将字符串路径转换为File对象File(String parent, String child)拼接父路径和子路径创建File对象File(File parent, String child)拼接父File对象与子路径创建File对象为什么要把字符串表示的路径变成File对象因为String类本身没有操作文件的方法如删除、创建等而File类提供了丰富的方法。因此我们需要将路径包装成File对象来调用这些方法下面是三种构造方法的演示代码// FileDemo1.javapublicclassFileDemo1{publicstaticvoidmain(String[]args){method1();method2();method3();}// 1. File(String pathname)privatestaticvoidmethod1(){StringpathC:\\wb\\a.txt;FilefilenewFile(path);// 将字符串路径封装为File对象以便使用File类的方法System.out.println(file);// C:\wb\a.txt}// 2. File(String parent, String child) -- 路径拼接privatestaticvoidmethod2(){Stringpath1C:\\wb;Stringpath2a.txt;FilefilenewFile(path1,path2);System.out.println(file);// C:\wb\a.txt}// 3. File(File parent, String child) -- 父File 子路径privatestaticvoidmethod3(){Filefile1newFile(C:\\wb);Stringpatha.txt;FilefilenewFile(file1,path);System.out.println(file);// C:\wb\a.txt}}应用场景第一种构造当一个完整路径字符串需要被操作时使用。第二/三种构造多用于路径拼接例如已知目录和文件名进行组合。绝对路径与相对路径Java中的路径分为两类绝对路径从盘符开始位置固定不变。例如 D:\wb\a.txt。相对路径相对当前项目而言没有盘符开头。例如 a.txt 表示当前项目根目录下的文件。代码示例// FileDemo2.javapublicclassFileDemo2{publicstaticvoidmain(String[]args){// 绝对路径固定指向D盘下的文件Filefile1newFile(D:\\wb\\a.txt);// 相对路径当前项目根目录下的a.txtFilefile2newFile(a.txt);// 相对路径当前项目下指定模块中的a.txtFilefile3newFile(filemodule\\a.txt);}}注相对路径的参照物是“当前项目”。如果要把文件放在模块内部需要加上模块名。File的创建功能File类提供了三个创建方法方法说明boolean createNewFile()创建一个新文件若已存在则返回falseboolean mkdir()创建单级文件夹不能创建多级boolean mkdirs()创建多级文件夹也可创建单级注意点总结 (来自注释与实验)createNewFile不管调用者的名称是否有后缀只能创建文件若文件所在目录不存在会抛出IOException。mkdir只能创建单级文件夹即使名称带后缀也只能创建文件夹。mkdirs可以创建单级或多级文件夹不管调用者有没有后缀都只创建文件夹。代码演示// FileDemo3.javapublicclassFileDemo3{publicstaticvoidmain(String[]args)throwsIOException{method1();// createNewFilemethod2();// mkdir// 演示 mkdirsFilefilenewFile(C:\\wb\\aaa.txt);booleanresultfile.mkdirs();System.out.println(result);// true}// createNewFile只能创建文件privatestaticvoidmethod1()throwsIOException{// 假设C:\wb\aaa 不存在Filefile1newFile(C:\\wb\\aaa);booleanresult1file1.createNewFile();System.out.println(result1);// 即使名称为aaa仍然创建的是一个无后缀的文件}// mkdir只能创建单级文件夹privatestaticvoidmethod2(){FilefilenewFile(C:\\wb\\aaa.txt);booleanresultfile.mkdir();System.out.println(result);// 即使名称为aaa.txt仍会创建名为aaa.txt的文件夹}}补充mkdirs底层会先尝试调用mkdir如果创建单级失败再递归创建多级因此开发中一般直接使用mkdirs即可。File的删除方法boolean delete()用于删除文件或空文件夹。注意点删除不走回收站直接从硬盘移除不可恢复。如果删除的是文件则直接删除。如果删除的是文件夹只能删除空文件夹。若想删除有内容的文件夹需先递归删除内部所有内容再删除该文件夹自身。代码演示// FileDemo4.javapublicclassFileDemo4{publicstaticvoidmain(String[]args){method1();// 删除文件// 删除空文件夹示例FilefilenewFile(C:\\wb);booleanresultfile.delete();System.out.println(result);}privatestaticvoidmethod1(){FilefilenewFile(C:\\wb\\a.txt);booleanresultfile.delete();System.out.println(result);}}File的判断与获取方法方法说明boolean isFile()判断是否为文件boolean isDirectory()判断是否为文件夹boolean exists()判断文件或文件夹是否存在String getName()获取文件或文件夹名称文件包含后缀代码演示// FileDemo5.javapublicclassFileDemo5{publicstaticvoidmain(String[]args){method1();// isFile isDirectory (文件)method2();// isFile isDirectory (文件夹)method3();// exists// getName 演示FilefilenewFile(a.txt);System.out.println(file.getName());// a.txtFilefile1newFile(C:\\wb);System.out.println(file1.getName());// wb}privatestaticvoidmethod1(){FilefilenewFile(C:\\wb\\a.txt);System.out.println(file.isFile());// trueSystem.out.println(file.isDirectory());// false}privatestaticvoidmethod2(){FilefilenewFile(C:\\wb);System.out.println(file.isFile());// falseSystem.out.println(file.isDirectory());// true}privatestaticvoidmethod3(){FilefilenewFile(a.txt);System.out.println(file.exists());// false假设不存在}}File的高级获取方法listFilesFile[]listFiles()返回目录下所有文件和文件夹的File对象数组包括隐藏文件/文件夹。注意事项调用者情况返回值调用者是文件返回 null调用者是空文件夹返回长度为0的数组调用者是有内容的文件夹返回包含所有子文件和子文件夹的数组调用者不存在或无权限返回 null代码演示// FileDemo6.javapublicclassFileDemo6{publicstaticvoidmain(String[]args){FilefilenewFile(D:\\aaa);File[]filesfile.listFiles();// 获取D盘aaa目录下的所有内容System.out.println(files.length);for(Filepath:files){System.out.println(path);}}}综合练习项目代码结构本次博客示例的项目结构如下filemodule/ └── src/ └── com/ └── wb/ ├── filedemo/ │ ├── FileDemo1.java │ ├── FileDemo2.java │ ├── FileDemo3.java │ ├── FileDemo4.java │ ├── FileDemo5.java │ └── FileDemo6.java └── filetest/ ├── Test1.java ├── Test2.java └── Test3.javafiledemo 包演示 File 类基本 API 的用法。filetest 包综合练习运用所学知识解决实际问题。1 ) 练习1在指定目录中创建文件需求在当前模块的 aaa 文件夹下创建一个 a.txt 文件。关键点createNewFile要求父文件夹必须存在否则会抛出IOException。因此需要先判断并创建目录再创建文件。// Test1.javapublicclassTest1{publicstaticvoidmain(String[]args)throwsIOException{// 目标在 module/aaa/ 下创建 a.txtFilefilenewFile(filemodule\\aaa);if(!file.exists()){// 若aaa文件夹不存在先创建mkdirs保证多级创建file.mkdirs();}// 拼接新文件路径FilenewFilenewFile(file,a.txt);newFile.createNewFile();}}2 ) 练习2递归删除多级文件夹需求删除一个包含子文件和子文件夹的多级文件夹。思路进入文件夹获取所有内部内容的File对象数组。遍历数组如果是文件则直接删除如果是文件夹则递归删除。内部清空后最后删除自身。递归流程图假设目录结构为 src 内含 a.txt、b.txt 和 AAA 文件夹AAA 内含 a.txt 和空文件夹是文件是文件夹 (AAA)a.txt空文件夹调用 deleteDir(src)listFiles 获取 src 内容遍历数组直接 delete递归调用 deleteDir(AAA)listFiles 获取 AAA 内容遍历delete递归 deleteDir(空文件夹)listFiles 返回空数组, 遍历跳过delete 空文件夹delete AAAdelete src对应代码// Test2.javapublicclassTest2{publicstaticvoidmain(String[]args){FilesrcnewFile(C:\\Users\\apple\\Desktop\\src);deleteDir(src);}privatestaticvoiddeleteDir(Filesrc){// 1. 进入文件夹获取所有内容File[]filessrc.listFiles();// 2. 遍历for(Filefile:files){if(file.isFile()){// 3. 文件直接删除file.delete();}else{// 4. 文件夹递归删除deleteDir(file);}}// 最后删除该文件夹自身src.delete();}}3 ) 练习3统计文件夹中每种文件出现的次数需求统计一个文件夹中每种文件.txt, .java, .jpg 等的数量并打印。思路使用HashMapString, Integer集合键为后缀名值为次数。利用递归遍历所有子文件夹。对于每个文件截取后缀名更新Map中的计数。注意需处理无后缀或特殊文件名的情况此处仅统计正则分割后长度为2的文件。// Test3.javapublicclassTest3{publicstaticvoidmain(String[]args){FilefilenewFile(filemodule);HashMapString,IntegerhmnewHashMap();getCount(hm,file);System.out.println(hm);}privatestaticvoidgetCount(HashMapString,Integerhm,Filefile){File[]filesfile.listFiles();for(Filef:files){if(f.isFile()){StringfileNamef.getName();String[]fileNameArrfileName.split(\\.);if(fileNameArr.length2){StringfileEndNamefileNameArr[1];if(hm.containsKey(fileEndName)){// 已存在获取原有次数1Integercounthm.get(fileEndName);count;hm.put(fileEndName,count);}else{// 首次出现次数记为1hm.put(fileEndName,1);}}}else{// 文件夹递归getCount(hm,f);}}}}这样我们便完成了对文件夹内各类文件数量的统计。总结通过本篇的学习你将掌握 File 类的基本使用方法理解绝对/相对路径、文件的创建与删除、递归操作等核心技能为后续学习 IO 流打下坚实基础。