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

[Java SE/文件系统/IO] 核心源码精讲:java.io.File

1 概述:java.io.File

Java 流(Stream)、文件(File)和IO

  • Java 中的Stream)、文件File)和 IO输入输出)是处理数据读取和写入的基础设施

它们允许程序与外部数据(如文件、网络、系统输入等)进行交互。

  • java.io 包是 Java 标准库中的一个核心包,提供了用于系统输入和输出的类,它包含了处理数据流(字节流和字符流)、文件读写、序列化以及数据格式化的工具。
  • java.io 是处理文件操作、流操作以及低级别 IO 操作的基础包。
  • java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
  • 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

java.io.File

  • 在 Java 中,File 类是 java.io 包的一个基础组件,它用于处理文件和目录路径名

  • Java File 类以抽象的方式代表文件名目录路径名File 类主要用于文件和目录的创建、文件的查找和文件的删除等。

  • File 对象代表磁盘中实际存在的文件和目录

2 使用指南

构造方法

File 对象代表磁盘中实际存在的文件和目录,通过以下构造方法创建一个 File 对象。

  • 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例:
File file = new File(String pathname);

如: File file1 = new File("C:/test/test.txt");// 通过路径字符串创建

  • 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File file = new File(String parent, String child);

如: File file2 = new File("C:/test", "test.txt");// 通过父路径和子路径创建

  • 通过给定的父抽象路径名子路径名字符串创建一个新的 File 实例:
File file = new File(File parent, String child);

如: File parent = new File("C:/test"); File file3 = new File(parent, "test.txt");//通过父File对象和子路径创建

  • 通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
File file = new File(URI uri) 

非构造方法

各方法亦可参见: https://www.runoob.com/java/java-file.html

序号 方法描述
1 public String getName() 返回由此抽象路径名表示的文件或目录的名称。
2 public String getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null
3 public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null
4 public String getPath() 将此抽象路径名转换为一个路径名字符串。
5 public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。
6 public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串。
7 public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。
8 public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。
9 public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
10 public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
11 public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
12 public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
13 public long length() 返回由此抽象路径名表示的文件的长度。
14 public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
15 public boolean delete() 删除此抽象路径名表示的文件或目录。
16 public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
17 [public String] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
18 [public String] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
19 [public File] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
20 [public File] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
21 public boolean mkdir() 创建此抽象路径名指定的目录。
22 public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
23 public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
24 public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。
25 public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。
26 public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
27 public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
28 public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。
29 public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象。
30 public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。
31 public String toString() 返回此抽象路径名的路径名字符串。

G 案例实践

CASE File#getXxxPath()方法间的差异

  • file.getPath()
D:\Workspace\Projects\xxx-Project\0400-Deploy\xxx-sdk-helper\NEXT\xxx-env\xxx.7.dbc
  • file.getName()
xxx.7.dbc
  • file.getAbsolutePath()
D:\Workspace\Projects\xxx-Project\0400-Deploy\xxx-sdk-helper\NEXT\xxx-env\xxx.7.dbc
  • file.getCanonicalPath()
D:\Workspace\Projects\xxx-Project\0400-Deploy\xxx-sdk-helper\NEXT\xxx-env\xxx.7.dbc
  • file.getParent()
D:\Workspace\Projects\xxx-Project\0400-Deploy\xxx-sdk-helper\NEXT\xxx-env
  • new URL("file:\\D:\\Workspace\\Projects\\xxx-Project\\0400-Deploy\\xxx-sdk-helper\\NEXT\\xxx-env\\xxx.7.dbc").getPath()
"/D:/Workspace/Projects/xxx-Project/0400-Deploy/xxx-sdk-helper/NEXT/xxx-env/xxx.7.dbc"
"/Workspace/Projects/xxx-Project/0400-Deploy/xxx-sdk-helper/NEXT/xxx-env/xxx.7.dbc"
  • new URL("file://").getPath()
""
  • new URL("file:///").getPath()
"/"

Z 最佳实践

FileFormatEnum

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;/*** @update-time 2025/09/20 22:46* @description 文件格式的枚举类* @refrence-doc* @gpt-promt*/
public enum FileFormatEnum {HEX_BIN("HEX_BIN", ".hex-bin"), BIN("BIN", ".bin"), JSON("JSON", ".json");private String code;private String format;private static Map<String, FileFormatEnum> FILE_FORMAT_CODES = new HashMap<>();//key=codeprivate static Map<String, FileFormatEnum> FILE_FORMAT_FORMATS = new HashMap<>();//key=formatstatic {for (FileFormatEnum type : values()) {FILE_FORMAT_CODES.put( type.code, type );FILE_FORMAT_FORMATS.put( type.format, type );}}FileFormatEnum(String code, String format) {this.code = code;this.format = format;}public static FileFormatEnum findByCode(String code) {return FILE_FORMAT_CODES.get(code);}public static FileFormatEnum findByFormat(String format) {return FILE_FORMAT_FORMATS.get(format);}public static FileFormatEnum findByFileName(String fileName) {/*** 切割文件名称* @note*  0. "target.zstd.hex-bin".split("\\."); => ["target", "zstd", "hex-bin"]*  1. "xx.tar.gz".split("\\.", 2); => ["xx", "tar", "gz"]*  2. ".tar.gz".split("\\."); => ["", "tar" , "gz"]*  3. "xx.gz".split("\\.", 2); => ["xx", "gz"]*  4. "xxx".split("\\.", 2); => ["xxx"] (异常情况)*///String [] fileNameInfo = fileName.split("\\.");//因: 正则表达式,需要转义`\\`处理//if( fileNameInfo.length <= 1){//    throw new RuntimeException("The file name is naming abnormal!fileName:" + fileName); //文件名称命名异常//}//String fileFormat = "." + fileNameInfo[fileNameInfo.length - 1];//取最后一段//FileFormatEnum fileFormatEnum = findByFormat( fileFormat );AtomicReference<FileFormatEnum> fileFormatEnum = new AtomicReference(null);FILE_FORMAT_FORMATS.entrySet().stream().forEach(fileFormatEntry -> {if( fileName.toLowerCase().endsWith( fileFormatEntry.getKey().toLowerCase() ) ) {fileFormatEnum.set( fileFormatEntry.getValue() );}});return fileFormatEnum.get();}public static FileFormatEnum findByFileNameThrowExceptionWhenNotFound(String fileName, Boolean throwExceptionWhenNotFound) {FileFormatEnum fileFormatEnum = findByFileName(fileName);if(fileFormatEnum == null && throwExceptionWhenNotFound){throw new RuntimeException("Not found the file format!fileName:" + fileName);}return fileFormatEnum;}public String getCode() {return code;}public String getFormat() {return format;}
}

Y 推荐文献

  • [Java SE] 基础工具库 : Apache Commons IO - 博客园/千千寰宇

X 参考文献

  • Java 流(Stream)、文件(File)和IO - 菜鸟教程
  • Java File 类 - 菜鸟教程
http://www.hskmm.com/?act=detail&tid=11711

相关文章:

  • Linux 内核整体架构详解
  • atoi() - 字符串( ASCLL )转换为整数( int )
  • 02.Python:Flash初步使用
  • 解决Kubernetes集群中master节点无法与node节点通信的策略
  • 从高版本的sqlserver向低版本的sqlserver上复制表和数据的方法
  • 在Ubuntu18.04安装兼容JDK 8的Eclipse集成开发环境
  • 【php】带数组的文件列表生成,返回数组
  • 配置Nginx以支持Websocket连接的方法
  • Extundelete工具恢复数据
  • 重新理解12306:它卖的从来不是“库存”,而是“状态”
  • 基于Python+Vue开发的房产销售管理系统源码+运行步骤
  • 混合架构(SpringCloud+Dubbo)的整合方案与适用场景(一) - 教程
  • 安全技术深度探讨:从鱿鱼皮肤到AI漏洞挖掘
  • 【Bluedroid】A2DP Source 音频流暂停流程解析[3]:AVDTP 协议中 Suspend Accept 响应的处理流程与建立分析(Suspend Accept)
  • 安装WSL
  • 数据建模流程分析
  • 数学笔记
  • PHP8.5 Pipeline Operator 你应该了解的 8 个特性
  • Nvidia Orin DK 本地 ollama 主流 20GB 级模型 gpt-oss, gemma3, qwen3 部署与测试 - 实践
  • 详细介绍:在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南
  • 完整教程:Ajax-day2(图书管理)-弹框显示和隐藏
  • civil 3d com api 帮助文档
  • WebSockets与Socket.io渗透测试实战指南
  • 完整教程:VLAN划分——TRUNK
  • 现代操作系统-音频处理技术1 Linux驱动底层
  • 元推理:人和事物,都是针对性的存在着与必然因果,残缺之美
  • 人和事物,都是针对性的存在着与必然因果,残缺之美
  • ArcEngine10.2中融合工具Dissolve的bug
  • Linux驱动适配I2C/SPI例子
  • [重要] PySimpleGU控件函数用法整理