当前位置: 首页 > news >正文

Java基础快速入门: File类与IO流基础

本文纲要

  1. FileIO概述
  2. File类的构造方法
  3. 绝对路径与相对路径
  4. File的创建功能
  5. File的删除方法
  6. File的判断与获取方法
  7. File的高级获取方法:listFiles
  8. 项目代码结构
  9. 综合练习
    练习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(){Stringpath="C:\\wb\\a.txt";Filefile=newFile(path);// 将字符串路径封装为File对象,以便使用File类的方法System.out.println(file);// C:\wb\a.txt}// 2. File(String parent, String child) -- 路径拼接privatestaticvoidmethod2(){Stringpath1="C:\\wb";Stringpath2="a.txt";Filefile=newFile(path1,path2);System.out.println(file);// C:\wb\a.txt}// 3. File(File parent, String child) -- 父File + 子路径privatestaticvoidmethod3(){Filefile1=newFile("C:\\wb");Stringpath="a.txt";Filefile=newFile(file1,path);System.out.println(file);// C:\wb\a.txt}}

应用场景:

  • 第一种构造:当一个完整路径字符串需要被操作时使用。
  • 第二/三种构造:多用于路径拼接,例如已知目录和文件名进行组合。

绝对路径与相对路径

Java中的路径分为两类:

  • 绝对路径:从盘符开始,位置固定不变。例如 D:\wb\a.txt。
  • 相对路径:相对当前项目而言,没有盘符开头。例如 a.txt 表示当前项目根目录下的文件。

代码示例

// FileDemo2.javapublicclassFileDemo2{publicstaticvoidmain(String[]args){// 绝对路径:固定指向D盘下的文件Filefile1=newFile("D:\\wb\\a.txt");// 相对路径:当前项目根目录下的a.txtFilefile2=newFile("a.txt");// 相对路径:当前项目下指定模块中的a.txtFilefile3=newFile("filemodule\\a.txt");}}

注:相对路径的参照物是“当前项目”。
如果要把文件放在模块内部,需要加上模块名。

File的创建功能

File类提供了三个创建方法:

方法说明
boolean createNewFile()创建一个新文件,若已存在则返回false
boolean mkdir()创建单级文件夹,不能创建多级
boolean mkdirs()创建多级文件夹(也可创建单级)

注意点总结 (来自注释与实验):
createNewFile不管调用者的名称是否有后缀,只能创建文件;若文件所在目录不存在,会抛出IOException
mkdir只能创建单级文件夹;即使名称带后缀,也只能创建文件夹。
mkdirs可以创建单级或多级文件夹;不管调用者有没有后缀,都只创建文件夹。

代码演示

// FileDemo3.javapublicclassFileDemo3{publicstaticvoidmain(String[]args)throwsIOException{method1();// createNewFilemethod2();// mkdir// 演示 mkdirsFilefile=newFile("C:\\wb\\aaa.txt");booleanresult=file.mkdirs();System.out.println(result);// true}// createNewFile:只能创建文件privatestaticvoidmethod1()throwsIOException{// 假设C:\wb\aaa 不存在Filefile1=newFile("C:\\wb\\aaa");booleanresult1=file1.createNewFile();System.out.println(result1);// 即使名称为aaa,仍然创建的是一个无后缀的文件}// mkdir:只能创建单级文件夹privatestaticvoidmethod2(){Filefile=newFile("C:\\wb\\aaa.txt");booleanresult=file.mkdir();System.out.println(result);// 即使名称为aaa.txt,仍会创建名为"aaa.txt"的文件夹}}

补充:mkdirs底层会先尝试调用mkdir,如果创建单级失败再递归创建多级,因此开发中一般直接使用mkdirs即可。

File的删除方法

boolean delete()用于删除文件或空文件夹。

注意点:

  1. 删除不走回收站,直接从硬盘移除,不可恢复。
  2. 如果删除的是文件,则直接删除。
  3. 如果删除的是文件夹,只能删除空文件夹。
  4. 若想删除有内容的文件夹,需先递归删除内部所有内容,再删除该文件夹自身。

代码演示

// FileDemo4.javapublicclassFileDemo4{publicstaticvoidmain(String[]args){method1();// 删除文件// 删除空文件夹示例Filefile=newFile("C:\\wb");booleanresult=file.delete();System.out.println(result);}privatestaticvoidmethod1(){Filefile=newFile("C:\\wb\\a.txt");booleanresult=file.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 演示Filefile=newFile("a.txt");System.out.println(file.getName());// a.txtFilefile1=newFile("C:\\wb");System.out.println(file1.getName());// wb}privatestaticvoidmethod1(){Filefile=newFile("C:\\wb\\a.txt");System.out.println(file.isFile());// trueSystem.out.println(file.isDirectory());// false}privatestaticvoidmethod2(){Filefile=newFile("C:\\wb");System.out.println(file.isFile());// falseSystem.out.println(file.isDirectory());// true}privatestaticvoidmethod3(){Filefile=newFile("a.txt");System.out.println(file.exists());// false(假设不存在)}}

File的高级获取方法:listFiles

File[]listFiles()返回目录下所有文件和文件夹的File对象数组(包括隐藏文件/文件夹)。
注意事项

调用者情况返回值
调用者是文件返回 null
调用者是空文件夹返回长度为0的数组
调用者是有内容的文件夹返回包含所有子文件和子文件夹的数组
调用者不存在无权限返回 null

代码演示

// FileDemo6.javapublicclassFileDemo6{publicstaticvoidmain(String[]args){Filefile=newFile("D:\\aaa");File[]files=file.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.java

filedemo 包:演示 File 类基本 API 的用法。
filetest 包:综合练习,运用所学知识解决实际问题。

1 ) 练习1:在指定目录中创建文件

需求:在当前模块的 aaa 文件夹下创建一个 a.txt 文件。

关键点:createNewFile要求父文件夹必须存在,否则会抛出IOException
因此需要先判断并创建目录,再创建文件。

// Test1.javapublicclassTest1{publicstaticvoidmain(String[]args)throwsIOException{// 目标:在 module/aaa/ 下创建 a.txtFilefile=newFile("filemodule\\aaa");if(!file.exists()){// 若aaa文件夹不存在,先创建(mkdirs保证多级创建)file.mkdirs();}// 拼接新文件路径FilenewFile=newFile(file,"a.txt");newFile.createNewFile();}}

2 ) 练习2:递归删除多级文件夹

需求:删除一个包含子文件和子文件夹的多级文件夹。

思路:

  1. 进入文件夹,获取所有内部内容的File对象数组。
  2. 遍历数组:如果是文件则直接删除;如果是文件夹则递归删除。
  3. 内部清空后,最后删除自身。

递归流程图(假设目录结构为 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 AAA

delete src

对应代码:

// Test2.javapublicclassTest2{publicstaticvoidmain(String[]args){Filesrc=newFile("C:\\Users\\apple\\Desktop\\src");deleteDir(src);}privatestaticvoiddeleteDir(Filesrc){// 1. 进入文件夹,获取所有内容File[]files=src.listFiles();// 2. 遍历for(Filefile:files){if(file.isFile()){// 3. 文件直接删除file.delete();}else{// 4. 文件夹:递归删除deleteDir(file);}}// 最后删除该文件夹自身src.delete();}}

3 ) 练习3:统计文件夹中每种文件出现的次数

需求:统计一个文件夹中,每种文件(.txt, .java, .jpg 等)的数量并打印。

思路:
使用HashMap<String, Integer>集合,键为后缀名,值为次数。
利用递归遍历所有子文件夹。
对于每个文件,截取后缀名,更新Map中的计数。

注意:需处理无后缀或特殊文件名的情况,此处仅统计正则分割后长度为2的文件。

// Test3.javapublicclassTest3{publicstaticvoidmain(String[]args){Filefile=newFile("filemodule");HashMap<String,Integer>hm=newHashMap<>();getCount(hm,file);System.out.println(hm);}privatestaticvoidgetCount(HashMap<String,Integer>hm,Filefile){File[]files=file.listFiles();for(Filef:files){if(f.isFile()){StringfileName=f.getName();String[]fileNameArr=fileName.split("\\.");if(fileNameArr.length==2){StringfileEndName=fileNameArr[1];if(hm.containsKey(fileEndName)){// 已存在:获取原有次数,+1Integercount=hm.get(fileEndName);count++;hm.put(fileEndName,count);}else{// 首次出现:次数记为1hm.put(fileEndName,1);}}}else{// 文件夹:递归getCount(hm,f);}}}}

这样,我们便完成了对文件夹内各类文件数量的统计。

总结

通过本篇的学习,你将掌握 File 类的基本使用方法,理解绝对/相对路径、文件的创建与删除、递归操作等核心技能,为后续学习 IO 流打下坚实基础。

http://www.cnnetsun.cn/news/3074559.html

相关文章:

  • 【AI大模型应用开发】【项目实战】9.基于GPT2搭建医疗问诊机器人
  • 版本兼容设计事件类预留版本字段:
  • C++ STL之互斥锁与条件变量详解
  • C++ STL 之随机数生成详解
  • GPIO详细介绍
  • 汽车软件测试,难点到底在哪?
  • 2026年7月零代码网站搭建与企业无代码建站工具测评:谁更适合你,
  • 手机AI Agent系统级集成实战:从架构到代码的完整指南
  • 告别信息过载:利用聚合平台的 Grok 模型快速提炼长文章核心观点
  • 英伟达“技术没有秘密“合理吗:研发总监拆解护城河的真相
  • Dify实战教程:从零搭建企业级AI应用,掌握低代码开发与工作流设计
  • TEE-TA学习轨迹第八篇:optee_os源码下TA分析之-app_secrets
  • Unsloth量化实战:消费级显卡(12GB)跑通8B大模型
  • 解决方案|腾讯安全天御金融反电诈产品解决方案
  • 09505黄大年茶思屋榜文95期 第5题 三方 CaaS下 CloudOS存储 Bypass关键技术
  • GPU PRO 5 - 4.2 Deferred Rendering Techniques on Mobile Devices 笔记
  • 【Java踩坑笔记】14_Collections.singletonList的坑:不能add也不能set
  • 2026年6月GESP真题及题解(C++一级):去旅行
  • pthread_create通过加锁设置线程启动竞争条件
  • 如何高效使用Diablo Edit2:暗黑破坏神2存档编辑器的完整指南
  • 查新报告分为哪几种?科技查新、查收查引与专利查新区别
  • Advanced XRay技术深度解析:如何通过方块渲染优化实现高效矿石定位
  • 5分钟免费让Windows拥有macOS优雅鼠标指针的完整指南
  • 用Backtrader回测DMI指标:一个Python量化新手的实战踩坑记录(附完整代码)
  • 基于sigrity的TDR/TDT仿真设计
  • 数据安全检查,这3个API盲区最容易被问穿
  • 如何用中文工作流轻松玩转AI绘画?这份完整指南让你从入门到精通
  • 第018章:ComfyUI文生图Z-Image模型创建数字人模特(二)
  • 01 静态分析(Static Analysis)
  • PKMS+AppOps 双权限体系:隐私管控、特权白名单全流程源码剖析