File 类及其方法

文章目录

  • [1. 概述](#1. 概述)
  • [2. 构造方法](#2. 构造方法)
  • [3. 常用方法](#3. 常用方法)
    • [3.1 获取文件和目录基本信息](#3.1 获取文件和目录基本信息)
    • [3.2 路径](#3.2 路径)
    • [3.3 判断功能](#3.3 判断功能)
    • [3.4 创建和删除](#3.4 创建和删除)
    • [3.5 目录操作](#3.5 目录操作)

1. 概述

File 类是 java.io 包下代表与平台无关的文件和目录,也就是说如果希望在程序中 操作文件和目录 都可以通过 File 类来完成,File 类能新建、删除、重命名文件和目录,但是不可以访问文件内容本身

在 API 中 File 的解释是文件和目录路径名的抽象表示形式, 即 File 类是文件或目录的路径,而不是文件本身,因此 File 类不能直接访问文件内容本身 ,如果需要访问文件内容本身,则需要使用 输入/输出流

File 类代表磁盘或网络中某个文件或目录的路径名称。

但不能直接通过File对象读取和写入数据,如果要操作数据,需要IO流。File对象好比是到水库的"路线地址",要"存取"里面的水到你"家里",需要"管道"。

2. 构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

代码示例:

java 复制代码
File testFile = new File("D:/test");

File snowTxt = new File("D:/test", "snow.txt");

File snowTxt2 = new File(testFile, "snow.txt");

无论该路径下是否存在文件或者目录,都不影响 File 对象的创建。

代码和文件物理路径对比:

3. 常用方法

3.1 获取文件和目录基本信息

  • public String getName() :返回由此 File 表示的文件或目录的名称。
  • public long length() :返回由此 File 表示的文件的长度。
  • public String getPath() :将此 File 转换为路径名字符串。
  • public long lastModified():返回 File 对象对应的文件或目录的最后修改时间(毫秒值)

示例代码:

java 复制代码
public static void main(String[] args) {
    File f = new File("D:/aaa/bbb.txt");     
    System.out.println("文件构造路径:" + f.getPath());
    System.out.println("文件名称:" + f.getName());
    System.out.println("文件长度:" + f.length()+"字节");
    System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai")));

    File f2 = new File("D:/aaa");     
    System.out.println("目录构造路径:" + f2.getPath());
    System.out.println("目录名称:" + f2.getName());
    System.out.println("目录长度:" + f2.length()+"字节");
    System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai")));
}

3.2 路径

  • public String getPath() :将此File转换为路径名字符串。
  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • String getCanonicalPath():返回此File对象所对应的规范路径名。

File 类可以使用文件路径字符串来创建 File 实例,该文件路径字符串既可以是绝对路径,也可以是相对路径

默认情况下,系统总是依据用户的工作路径来解释相对路径,这个路径由系统属性"user.dir"指定,通常也就是运行Java虚拟机时所作的路径。

  • 绝对路径:从盘符开始的路径,这是一个完整的路径。
  • 相对路径 :相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
  • 规范路径:所谓规范路径名,即对路径中的"..."等进行解析后的路径名
java 复制代码
@Test
public void test1() throws IOException{
    File f1 = new File("D:/javase/HelloIO.java");
    System.out.println("文件/目录的名称:" + f1.getName());
    System.out.println("文件/目录的构造路径名:" + f1.getPath());
    System.out.println("文件/目录的绝对路径名:" + f1.getAbsolutePath());
    System.out.println("文件/目录的规范路径名:" + f1.getCanonicalPath());
    System.out.println("文件/目录的父目录名:" + f1.getParent());
}
@Test
public void test2() throws IOException{
    File f2 = new File("HelloIO.java");
    System.out.println("user.dir =" + System.getProperty("user.dir"));
    System.out.println("文件/目录的名称:" + f2.getName());
    System.out.println("文件/目录的构造路径名:" + f2.getPath());
    System.out.println("文件/目录的绝对路径名:" + f2.getAbsolutePath());
    System.out.println("文件/目录的规范路径名:" + f2.getCanonicalPath());
    System.out.println("文件/目录的父目录名:" + f2.getParent());
}
    @Test
public void test3() throws IOException{
    File f3 = new File("../../HelloIO.java");
    System.out.println("user.dir =" + System.getProperty("user.dir"));
    System.out.println("文件/目录的名称:" + f3.getName());
    System.out.println("文件/目录的构造路径名:" + f3.getPath());
    System.out.println("文件/目录的绝对路径名:" + f3.getAbsolutePath());
    System.out.println("文件/目录的规范路径名:" + f3.getCanonicalPath());
    System.out.println("文件/目录的父目录名:" + f3.getParent());
}
  • window 的路径分隔符使用"\",而Java程序中的"\"表示转义字符,所以在 Windows 中表示路径,需要用"\"。或者直接使用"/"也可以,Java 程序支持将"/"当成平台无关的路径分隔符。或者直接使用 File.separator 常量值表示。
  • 当构造路径是绝对路径 时,那么 getPathgetAbsolutePath 结果一样
  • 当构造路径是相对路径 时,那么getAbsolutePath的路径 = user.dir的路径 + 构造路径
  • 当路径中不包含"..."和"/开头"等形式的路径,那么规范路径和绝对路径一样,否则会将...等进行解析。路径中如果出现"..."表示上一级目录,路径名如果以"/"开头,表示从"根目录"下开始导航。

3.3 判断功能

  • public boolean exists() :此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。

示例代码:

java 复制代码
public static void main(String[] args) {
   File f = new File("d:\\aaa\\bbb.java");
   File f2 = new File("d:\\aaa");
    // 判断是否存在
   System.out.println("d:\\aaa\\bbb.java 是否存在:" + f.exists());
   System.out.println("d:\\aaa 是否存在:" + f2.exists());
    // 判断是文件还是目录
   System.out.println("d:\\aaa 文件?:" + f2.isFile());
   System.out.println("d:\\aaa 目录?:" + f2.isDirectory());
}

如果文件或目录存在,那么 exists()、isFile() 和 isDirectory() 都是返回true

3.4 创建和删除

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。 只能删除空目录
  • public boolean mkdir() :创建由此 File 表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

3.5 目录操作

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
  • public File[] listFiles(FileFilter filter):返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。

以上方法常用与递归操作:

(1)递归打印多级目录

分析:多级目录的打印。遍历之前,无从知道到底有多少级目录,所以我们可以使用递归实现。代码实现:

java 复制代码
public static void main(String[] args) {
    File testFile = new File("D:/test");
    printFile(testFile);
}

//  递归打印多级目录/文件
private static void printFile(File file){
    if( file == null || !file.exists() ){
        return;
    }

    System.out.println(file.getAbsolutePath());

    if( file.isDirectory() ){
        for( File f : file.listFiles() ){
            printFile(f);
        }
    }
}

(2)递归删除非空目录

如果目录非空,连同目录下的文件和文件夹一起删除

java 复制代码
public static void main(String[] args) {
    File testFile = new File("D:/test");
    delFile(testFile);
}

private static void delFile(File file){
    if( file == null || !file.exists() ){
        return;
    }
    if( file.isDirectory() ){
        for( File f : file.listFiles() ){
            delFile(f);
        }
    }
    file.delete();
}

以上就是 File 类及其常用方法的介绍和代码演示了。

相关推荐
P.H. Infinity36 分钟前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天39 分钟前
java的threadlocal为何内存泄漏
java
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋31 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络
Wx-bishekaifayuan1 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
全栈开发圈1 小时前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫