Java如何创建临时文件或目录

后端 潘老师 6个月前 (10-23) 151 ℃ (0) 扫码查看

在Java中,创建临时文件在许多情况下是必需的,例如单元测试、批处理操作、文件上传或大型请求处理,其中中间操作的结果必须保存以供稍后参考。

本Java教程讨论了几种简单的方法来创建临时文件或目录。

// 快速指引
Path tempFile = Files.createTempFile("test-data-", ".txt"); //NIO
//tempFile.toFile().deleteOnExit();
File tempFile = File.createTempFile("test-data-", ".txt") //Legacy
//tempFile.deleteOnExit();
Path tempDirectory = Files.createTempDirectory("temp-dir"); //创建一个临时目录
//Clean up with shutdown hook

如果我们打算在单元测试中创建临时文件/目录,最好使用TemporaryFolder(JUnit 4)或@TempDir(JUnit 5)。它们允许创建在测试方法结束时保证被删除的文件和目录(无论测试通过还是失败)。

1.默认的临时文件或目录位置

重要的是要知道,如果未指定目标位置,则将临时文件/目录创建在由系统属性java.io.tmpdir指定的默认临时目录中。

  • Windows – %USER%/AppData/Local/Temp/
  • Linux或macOS – /tmp/

2. 创建临时文件

2.1 使用Files.createTempFile() [Java NIO]

java.nio.file.Files.createTempFile()方法是一个重载方法。这两个方法都只会在调用方法之前不存在具有相同名称和位置的文件时才创建文件。

//语法
Path createTempFile(String prefix, String suffix, FileAttribute<?>... attrs)
Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs)
  • dir – 文件要创建的目录。如果为空,将使用前一节中指定的默认位置。
  • prefix – 用于生成文件的名称。它必须至少有三个字符长。
  • suffix – 用于生成文件的名称(通常是扩展名)。如果为空,将使用 “.tmp”。

在给定的示例中,当程序退出时,创建的临时文件将被删除。

FileAttribute<?>[] attributes = {
    PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rw-r--r--"))
};
Path tempFile = Files.createTempFile(Files.createTempDirectory("temp-dir"), "testData-", ".txt", attributes);
System.out.println(tempFile.toAbsolutePath().toString());

程序输出:

<Default temp path>\temp-dir10165603645741470295\testData-17461647418384794020.txt

如果我们想自动删除临时文件,请使用 DELETE_ON_CLOSE 选项打开文件,以便在处理文件后调用适当的 close() 方法时删除该文件,例如写入临时文件。

Path tempFile;
try {
  tempFile = Files.createTempFile("testData-", ".txt");
  try (var outputStream = Files.newOutputStream(tempFile, StandardOpenOption.DELETE_ON_CLOSE)) {
    // Write data to the file or perform operations...
  }
} catch (IOException e) {
  //...
}

或者,可以使用 shutdown-hook 或 File.deleteOnExit() 机制来自动删除文件。

try {
   tempFile = Files.createTempFile("testData-", ".txt");
   tempFile.toFile().deleteOnExit();
}

2.2. 使用 File.createTempFile() [Legacy]

这个 java.io.File.createTempFile() 的工作方式与 Files.createTempFile() 类似,如前一个示例所示。它使用给定的前缀和后缀字符串生成其名称,在指定的目录中创建一个新的空临时文件。
两种方法之间的唯一区别在于它使用了旧式的 Java 类。

// 语法
File createTempFile(String prefix, String suffix) throws IOException
File createTempFile(String prefix, String suffix, File directory) throws IOException

让我们看一个例子。

ExampleFile tempFile;
try {
   tempFile = File.createTempFile("testData-", ".txt");
   System.out.println("Temp file created : " + tempFile.getAbsolutePath());
}
catch (IOException e) {
  //...
}

如果我们想在虚拟机关闭时自动删除临时文件,请使用deleteOnExit()方法。

File tempFile;
try {
   tempFile = File.createTempFile("testData-", ".txt");
   tempFile.deleteOnExit();   //当虚拟机终止时删除文件
   //...
}

3. 创建临时目录

创建临时目录与临时文件类似,我们也可以使用之前讨论的类来创建临时目录:

static Path createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs) throws IOException
static Path createTempDirectory(String prefix, FileAttribute<?>... attrs) throws IOException

在简单的用例中,我们通过指定目录名的前缀来创建目录:

Path tempDir = Files.createTempDirectory("tempDirPrefix-");

或者,我们也可以将临时目录的位置传递给我们。

Path tmpdir = Files.createTempDirectory(Paths.get("/temp/data/"), "tempDirPrefix-");

请注意,Java不会在JVM退出时自动删除该目录。如果我们希望创建的临时目录在JVM退出时被自动删除,我们需要注册一个关闭钩子来处理清理工作。在下面的示例中,Files.walk()以相反的顺序递归遍历目录及其内容,并删除每个文件和子目录。

try {
  // 创建一个临时目录
  Path tempDirectory = Files.createTempDirectory("temp-dir");
  // 注册一个 shutdown hook,在 JVM 退出时删除该目录
  Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    try {
      Files.walk(tempDirectory)
          .sorted((p1, p2) -> -p1.compareTo(p2))
          .forEach(path -> {
              try {
                  Files.delete(path);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          });
    } catch (IOException e) {
      e.printStackTrace();
    }
  }));
  // 在临时目录中执行一些操作..
} catch (IOException e) {
  e.printStackTrace();
}

请记住,使用关闭钩子可能很有用,但它可能无法覆盖所有潜在的情况(例如,强制终止JVM)。

4. 结论

在Java中,使用java.nio.file.Files类是创建临时文件或临时目录的最佳方法。使用任何其他第三方库可能没有额外的优势。如果只为了存储中间结果而创建临时文件和目录,则清理它们很重要。这将有助于控制操作系统的大小。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10195.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】