Java 中 File 类的全面指南:文件与目录操作详解 📅 2026/7/5 5:40:58 1. 引言在 Java 编程中文件和目录的操作是日常开发不可或缺的一部分。java.io.File类作为 Java 标准库中最早提供的文件抽象提供了对文件和目录路径名的表示以及创建、删除、重命名、查询属性等基本操作。虽然 Java 7 引入了java.nio.file.Path和Files等更现代的 API但File类因其简单易用至今仍被广泛使用。本文将全面介绍File类的核心用法帮助你掌握 Java 文件操作的基础。2. File 类概述File类位于java.io包中它不是文件本身而是文件或目录路径名的抽象表示。一个File对象可以指向一个文件、一个目录甚至是一个尚不存在的路径。2.1 构造方法File类提供了多种构造方式// 通过路径名字符串创建Filefile1newFile(/home/user/test.txt);// 通过父路径和子路径字符串创建Filefile2newFile(/home/user,test.txt);// 通过父 File 对象和子路径字符串创建FileparentDirnewFile(/home/user);Filefile3newFile(parentDir,test.txt);// 通过 URI 创建Filefile4newFile(newURI(file:///home/user/test.txt));2.2 路径分隔符Java 中路径分隔符与操作系统相关推荐使用常量// 路径分隔符Windows 为 ;Linux/macOS 为 :StringpathSeparatorFile.pathSeparator;// 名称分隔符Windows 为 \Linux/macOS 为 /StringseparatorFile.separator;// 推荐使用跨平台写法FilefilenewFile(dataFile.separatorconfig.properties);3. 文件属性查询File类提供了丰富的方法来获取文件或目录的元信息。3.1 基本属性FilefilenewFile(example.txt);// 文件名Stringnamefile.getName();// example.txt// 绝对路径StringabsPathfile.getAbsolutePath();// /home/user/example.txt// 父路径Stringparentfile.getParent();// /home/user// 文件大小字节longlengthfile.length();// 最后修改时间毫秒时间戳longlastModifiedfile.lastModified();3.2 状态判断booleanexistsfile.exists();// 文件或目录是否存在booleanisFilefile.isFile();// 是否为文件booleanisDirfile.isDirectory();// 是否为目录booleanisHiddenfile.isHidden();// 是否隐藏booleancanReadfile.canRead();// 是否可读booleancanWritefile.canWrite();// 是否可写booleancanExecutefile.canExecute();// 是否可执行4. 文件与目录操作4.1 创建与删除FilefilenewFile(newFile.txt);// 创建新文件返回 true 表示创建成功booleancreatedfile.createNewFile();// 删除文件或空目录booleandeletedfile.delete();// JVM 退出时自动删除适用于临时文件file.deleteOnExit();// 创建单级目录FiledirnewFile(myDir);booleandirCreateddir.mkdir();// 创建多级目录包括所有不存在的父目录FilemultiDirnewFile(a/b/c/d);booleanmultiCreatedmultiDir.mkdirs();4.2 重命名与移动FilesourcenewFile(old.txt);FiletargetnewFile(new.txt);// 重命名/移动在同一文件系统内booleanrenamedsource.renameTo(target);注意renameTo的行为依赖于平台跨文件系统移动时可能失败。推荐使用Files.move()进行可靠的移动操作。4.3 临时文件// 创建临时文件默认目录为系统临时目录FiletempFileFile.createTempFile(prefix,.tmp);// 指定临时文件目录FiletempDirnewFile(/tmp/myapp);FiletempFile2File.createTempFile(log,.txt,tempDir);// 临时文件通常配合 deleteOnExit 使用tempFile.deleteOnExit();5. 目录遍历5.1 列出子项FiledirnewFile(/home/user);// 列出所有子文件/目录名String[]namesdir.list();// 列出所有子 File 对象File[]filesdir.listFiles();// 使用文件名过滤器File[]txtFilesdir.listFiles(newFilenameFilter(){Overridepublicbooleanaccept(Filedir,Stringname){returnname.endsWith(.txt);}});// 使用 FileFilterJava 8 Lambda 写法File[]largeFilesdir.listFiles(f-f.isFile()f.length()1024*1024);5.2 递归遍历目录树publicstaticvoidlistAllFiles(Filedir,Stringindent){File[]filesdir.listFiles();if(filesnull)return;for(Filefile:files){System.out.println(indentfile.getName());if(file.isDirectory()){listAllFiles(file,indent );}}}// 调用listAllFiles(newFile(/home/user),);6. 文件路径操作6.1 相对路径与绝对路径FilerelativenewFile(docs/readme.txt);System.out.println(relative.getPath());// docs/readme.txtSystem.out.println(relative.getAbsolutePath());// /current/working/dir/docs/readme.txt// 获取规范路径解析 . 和 ..Filecanonicalrelative.getCanonicalFile();System.out.println(canonical.getPath());// 解析后的绝对路径6.2 路径转换// File 转 URIURIurifile.toURI();// File 转 PathJava 7Pathpathfile.toPath();// 获取文件系统根目录File[]rootsFile.listRoots();// Windows 返回 C:\, D:\ 等Linux 返回 /7. 实战示例文件工具类下面是一个实用的文件操作工具类整合了常用功能importjava.io.*;publicclassFileUtils{/** 递归删除文件或目录 */publicstaticbooleandeleteRecursively(Filefile){if(file.isDirectory()){File[]childrenfile.listFiles();if(children!null){for(Filechild:children){deleteRecursively(child);}}}returnfile.delete();}/** 复制文件字节流方式 */publicstaticvoidcopyFile(Filesource,Filedest)throwsIOException{try(InputStreaminnewFileInputStream(source);OutputStreamoutnewFileOutputStream(dest)){byte[]buffernewbyte[8192];intlen;while((lenin.read(buffer))!-1){out.write(buffer,0,len);}}}/** 获取文件扩展名 */publicstaticStringgetExtension(Filefile){Stringnamefile.getName();intdotIndexname.lastIndexOf(.);return(dotIndex-1)?:name.substring(dotIndex1);}/** 获取文件大小可读格式 */publicstaticStringformatSize(longbytes){String[]units{B,KB,MB,GB,TB};intunitIndex0;doublesizebytes;while(size1024unitIndexunits.length-1){size/1024;unitIndex;}returnString.format(%.2f %s,size,units[unitIndex]);}}8. File 类的局限与替代方案虽然File类简单易用但它存在一些局限性局限说明替代方案不支持符号链接处理无法区分符号链接与真实文件java.nio.file.Files元数据操作有限无法设置文件权限、所有者等Files.setPosixFilePermissions()不支持文件监视无法监听文件变化事件java.nio.file.WatchService异常处理不完善失败时返回 boolean不抛异常Files方法抛出IOException不支持文件属性批量读取每次查询都需系统调用Files.readAttributes()对于新项目建议优先考虑java.nio.file包下的Path、Paths和Files类它们提供了更强大、更可靠的文件操作能力。9. 总结java.io.File类是 Java 文件操作的基础掌握它的核心方法对于日常开发至关重要。本文从构造方法、属性查询、创建删除、目录遍历到实战工具类全面覆盖了File的常见用法。虽然File类在新项目中逐渐被NIO.2API 取代但理解它仍然是学习 Java I/O 体系的重要一步。建议你在实际开发中根据需求选择合适的 API在简单场景下File类依然是一个轻量高效的选择。