Java 中使用 File 类创建文件

Java 中的 File 类

在 Java 中,文件文件流是处理数据输入/输出的两个核心概念,它们是 Java I/O 操作的基础。

一、文件(File)

定义
  • 文件是操作系统中的存储单元,用于持久化保存数据(如文本、图片、二进制数据等)。
  • 在 Java 中,java.io.File 类(或 Java 7+ 的 java.nio.file.Path)用于表示文件或目录的抽象路径。
  • 文件本身不存储数据,而是通过路径指向磁盘上的具体数据。

二、File 类的介绍

在这里插入图片描述

1 创建文件对象的相关构造器

image-20250201115045518

  • new File(File parent, String child) :将父路径(字符串形式)和子路径拼接成一个完整路径。自动处理路径分隔符(如 Windows 的 \ 或 Linux 的 /)。

    // 示例1:拼接父路径和子文件
    String parentDir = "C:/Users/Test";
    String childFile = "data.txt";
    File file = new File(parentDir, childFile);
    //会在2个目录之间自动加上'/'或'\'
    System.out.println(file.getPath()); // 输出: C:\Users\Test\data.txt
    
    // 示例2:拼接多级目录
    File dir = new File("src", "main/java/com/example");
    System.out.println(dir.getPath()); // 输出: src\main\java\com\example
    
  • new File(String pathname) :直接通过路径名字符串(绝对路径或相对路径)创建 File 对象。路径可以是文件或目录。

    // 示例1:使用绝对路径
    File file1 = new File("C:/Users/Test/example.txt");
    System.out.println(file1.getPath()); 
    // 输出: C:\Users\Test\example.txt
    
    // 示例2:使用相对路径(相对于当前项目根目录)
    File file2 = new File("data/config.json");
    System.out.println(file2.getPath()); 
    // 输出: data\config.json
    
  • new File(File parent, String child) :使用一个已有的 File 对象表示父路径,再拼接子路径。比字符串拼接更灵活,避免路径分隔符错误。

    // 示例1:基于父目录对象创建子文件
    File parentDir = new File("C:/Users/Test");
    File childFile = new File(parentDir, "logs/app.log");
    System.out.println(childFile.getPath()); // 输出: C:\Users\Test\logs\app.log
    
    // 示例2:链式拼接目录
    File baseDir = new File("projects");
    File srcDir = new File(baseDir, "src");
    File mainFile = new File(srcDir, "Main.java");
    System.out.println(mainFile.getPath()); // 输出: projects\src\Main.java
    
  • new File(URI rui) :通过 URI(统一资源标识符) 创建 File 对象。URI 格式需符合 file: 协议(如 file:/C:/test/data.txt)。

    import java.net.URI;
    
    // 示例1:使用URI创建File对象
    try {
        URI uri = new URI("file:/C:/Users/Test/example.txt");
        File file = new File(uri);
        System.out.println(file.getPath()); 
        // 输出: C:\Users\Test\example.txt
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    // 示例2:处理空格和特殊字符
    //URI 中的特殊字符(如空格)需用 %20 表示,构造方法会解码后转换为实际路径。
    URI uri2 = URI.create("file:/C:/My%20Documents/report.pdf");
    File file2 = new File(uri2);
    System.out.println(file2.getPath()); 
    // 输出: C:\My Documents\report.pdf
    

总结对比

构造方法典型使用场景优点
File(String pathname)直接指定完整路径简单直接,适合已知路径
File(String parent, String child)动态拼接父路径和子路径避免手动处理路径分隔符
File(File parent, String child)基于已有的 File 对象构建子路径支持链式操作,路径更安全
File(URI uri)从 URI 格式创建(如编码后的路径)自动处理特殊字符和协议

注意File 对象只是一个路径的抽象:创建 File 类对象,并不会真的在我们电脑上对应的目录下面创建文件,如果需要实际的创建文件需要显式的调用。

  • 构造 File 对象(如 new File("a.txt")不会自动创建物理文件,仅表示路径。
  • 必须通过显式调用 createNewFile() 或其他写入操作(如 FileOutputStream 写入数据)才能实际生成文件。

2 createNewFile() 的作用
  1. 功能

    • 显式创建一个空的文件(仅当文件不存在时)。
    • 如果文件已存在,则返回 false不会覆盖原有内容
  2. 语法

File file = new File("example.txt");
boolean isCreated = file.createNewFile(); // 返回 true 表示创建成功
  1. 注意事项:
  • 需要处理 IOException

    • 如果父目录不存在或没有写入权限,会抛出异常。

    • 必须用 try-catch 包裹或声明 throws

      import java.io.File;
      import java.io.IOException;
      
      public class CreateFileDemo {
          public static void main(String[] args) {
              File file = new File("test.txt");
              try {
                  if (file.createNewFile()) {
                      System.out.println("文件创建成功");
                  } else {
                      System.out.println("文件已存在");
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      
  • 父目录必须存在

    • 如果路径中的父目录不存在,createNewFile() 会失败。

    • 需先调用 file.getParentFile().mkdirs() 创建父目录:

      File file = new File("nonexistent_dir/data.txt");
      //File 对象仅表示路径,不检查文件是否存在!需通过 exists() 方法验证。
      if (!file.getParentFile().exists()) {
          file.getParentFile().mkdirs(); // 创建所有缺失的父目录
      }
      file.createNewFile();
      

3 获取文件相关信息的常用方法
  1. getName()
    • 作用:返回文件或目录的名称(不包含路径)。
    • 示例:路径为C:/test/file.txt时,返回file.txt;若为目录C:/test,返回test
  2. getAbsolutePath()
    • 作用:返回文件或目录的绝对路径字符串。
    • 注意:无论File对象是相对路径还是绝对路径创建,均解析为完整路径。例如,相对路径file.txt可能返回/home/user/file.txt
  3. getParent()
    • 作用:返回父目录的路径(字符串形式)。若无父目录(如根目录或单文件相对路径),则返回null
    • 示例:路径为C:/test/file.txt时,返回C:/test;路径为file.txt时,返回null
  4. length()
    • 作用:返回文件的字节大小。若文件不存在或为目录,通常返回0L
    • 注意:需先通过exists()isFile()验证目标是否为有效文件。
  5. exists()
    • 作用:检查文件或目录是否存在,返回布尔值。
    • 注意:可能受权限限制影响(如无访问权限时返回false)。
  6. isFile()
    • 作用:判断是否为标准文件(非目录或符号链接),返回布尔值。
    • 注意:若路径不存在,返回false
  7. isDirectory()
    • 作用:判断是否为目录,返回布尔值。
    • 注意:若路径不存在,返回false
import java.io.File;
import java.io.IOException;

public class Example {
    public static void main(String[] args) {
        read();
    }
    public static void read() {
        //1.getName()
        //路径指向文件
        File file1 = new File("D:/0.学习/File_Test/read.txt");
        System.out.println(file1.getName());// 输出 read.txt
        //路径为目录
        File file2 = new File("D:/0.学习/File_Test");
        System.out.println(file2.getName());// 输出 File_Test

        //2.getAbsolutePath()
        //以绝对路径创建 File 对象
        File file3 = new File("D:/0.学习/File_Test/read3.txt");
        //输出 D:/0.学习/File_Test/read3.txt
        System.out.println(file3.getAbsolutePath());
        //以相对路径创建 File 对象
        File file4 = new File("read4.txt");
        //输出绝对路径 D:\0.学习\java笔记\java_Code\TankGame\read4.txt
        System.out.println(file4.getAbsolutePath());

        //3.getParent()
        //File file3 = new File("D:/0.学习/File_Test/read3.txt");
        //输出 D:\0.学习\File_Test
        System.out.println(file3.getParent());
        //根目录或单文件相对路径,返回 null
        File file5 = new File("D:");
        System.out.println(file5.getParent());//null

        //4.length()
        File file6 = new File("D:/0.学习/File_Test/read6.txt");
        System.out.println(file6.length());
        try {
            file6.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println(file6.length());
    }
}

4 目录的操作和文件的删除

1. mkdir()

  • 作用 :创建单层目录(仅当父目录存在时才能成功)。
  • 返回值boolean:目录创建成功返回 true,失败返回 false
  • 适用场景 :当明确知道父目录已经存在时,直接创建子目录。

2. mkdirs()

  • 作用 :创建多层目录(自动创建路径中所有不存在的父目录)。
  • 返回值boolean:所有目录创建成功返回 true,失败返回 false
  • 适用场景 :不确定父目录是否存在时,直接创建完整路径。

3. delete()

  • 作用 :删除文件或空目录(非空目录无法删除)。
  • 返回值boolean:删除成功返回 true,失败返回 false
  • 适用场景 :删除文件或空目录。
import java.io.File;
import java.io.IOException;

public class Example {
    public static void main(String[] args) {
        dir();
    }
    public static void dir() {
        //1.mkdir() 创建单层目录
        File file1 = new File("D:/0.学习/File_Test/demo1");
        //要求父目录必须存在,否则无法创建成功
        //即,D:/0.学习/File_Test 必须存在才能成功创建 demo1 目录
        boolean mkdir = file1.mkdir();
        if(mkdir) {
            System.out.println("创建成功");
        } else {
            System.out.println("创建失败");
        }

        //2.mkdirs() 创建多层目录
        File file2 = new File("D:/0.学习/File_Test/demo2");
        //如果路径中有不存在的自动创建
        boolean mkdirs = file2.mkdirs();

        //3.delete() 删除文件或空目录(非空目录无法删除)
        //删除 demo2 空目录
        boolean delete = file2.delete();
        File file3 = new File("D:/0.学习/File_Test/demo1/dir.txt");
        try {
            file3.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //删除 dir.txt 文件
        file3.delete();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值