在 Java 中创建临时文件

Mohd Mohtashim Nawaz 2023年10月12日
  1. 在 Java 中使用 Java Legacy IO 创建临时文件
  2. 在 Java 中使用 Java NIO 库创建临时文件
  3. 在 Java 中创建临时文件时要处理的隐藏异常
  4. 结论
在 Java 中创建临时文件

本文将演示如何使用不同的替代方法在 Java 中创建临时文件。

我们使用 Java 中的临时文件来存储程序执行期间的临时信息、释放资源或将信息传递给程序的其他部分。

在 Java 中使用 Java Legacy IO 创建临时文件

我们可以使用 java.io 包中的标准文件库在 Java 中创建临时文件。我们使用一种 createTempFile() 方法来制作临时文件。

让我们一一了解这两种多态形式。

在 Java 中创建临时文件的第一个多态形式的方法

我们可以在第一个实现中传递两个参数:prefixsuffix。通过将前缀和后缀添加到标识符来生成文件名。

JVM 本身会生成标识符。临时文件的名称类似于下面给出的形式。

prefixIDsuffix

当我们使用这种方法创建临时文件时,临时文件存储在临时文件的默认目录中。用于存储临时文件的默认目录可能因操作系统而异。

\tmp 目录是 Linux 操作系统中临时文件的默认目录。如果我们使用 Windows 平台,默认目录一般是 C:\\WINNT\\TEMP

让我们看看 createTempFile() 方法的第一种多态形式的定义。

public static File createTempFile(String prefix, String suffix) throws IOException

正如我们所见,这个方法抛出了 IOException。因此,在使用此方法时,我们应该使用 try-catch 块。

如果我们不想使用 try-catch 块,我们的方法应该抛出相同的异常以便稍后由我们或 JVM 处理它。

该方法返回一个 File 对象,其中包含创建的临时文件的绝对路径。

代码:

import java.io.File;
import java.io.IOException;

public class tempFile {
  public static void main(String[] args) {
    try {
      File file = File.createTempFile("myTemp", ".tmp");
      System.out.print(file);
      file.deleteOnExit();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

输出:

/tmp/myTemp14969130618851885659.tmp

如果我们不提供任何后缀参数,JVM 会添加默认的 .tmp 后缀。但是,我们不能省略前缀参数,它的长度至少应为三个字符。

我们使用了 deleteOnExit() 方法,在 JVM 退出时删除文件。我们应该始终在使用结束时删除临时文件作为一种好习惯。

Java 中创建临时文件的方法的第二种多态形式

我们可以在 createTempFile() 方法的第二个多态实现中提供三个参数。正如我们上面讨论的,前两个参数是相似的。

第三个参数是一个 File 对象,我们可以使用它来为我们的临时文件提供特定的路径。如果我们将 null 传递给第三个参数,则此实现的工作方式与第一个相同。

让我们看看 createTempFile() 方法的第二种多态形式的方法定义。

public static File createTempFile(String prefix, String suffix, File directory) throws IOException

此形式的命名约定、异常和所有其他工作方式与该方法的先前形式相同。

让我们看看使用这种方法创建临时文件的代码。

import java.io.File;
import java.io.IOException;

public class tempFile {
  public static void main(String[] args) {
    try {
      File path = new File("/home/stark/eclipse-workspace-java/JavaArticles");
      File file = File.createTempFile("myTemp", ".tmp", path);
      System.out.print(file);
      file.deleteOnExit();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

输出:

/home/stark/eclipse-workspace-java/JavaArticles/myTemp10717312880412401466.tmp

我们应该注意,临时文件是在代码中提供的目录中创建的,而不是在默认目录中创建的。

在 Java 中使用 Java NIO 库创建临时文件

我们可以使用替代的 java.nio.file.Files 库在运行时创建临时文件。这个库的行为类似于我们讨论过的传统 Java IO 库。

NIO 库还提供了 createTempFile() 方法的两种多态形式。两种多态形式的区别在于,另一种让我们传递文件路径。

该文件的名称是使用前缀和后缀以及类似于 Java 传统 IO 库的标识符创建的。如上所述,临时文件的默认路径也与 Java 遗留的 IO 库相同。

用于创建临时文件的传统 Java IO 方法与 NIO 库之间的显着区别在于,我们使用 NIO 库可以更好地控制文件的安全参数。

让我们看看 createTempFile() 方法的两种多态形式的方法定义。

public static Path createTempFile(String prefix, String suffix, FileAttribute<?>... attrs)
    throws IOException

上面给出的多态形式是第一种形式。下面给出第二种多晶型。

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

我们可以在这两种多态形式中找到 FileAttribute 参数。我们可以使用这个参数来提供文件级属性的列表,例如权限。

这些方法返回一个 Path 对象,该对象表示该方法创建的临时文件的路径。

让我们看看使用这个库创建临时文件的代码。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class tempFile2 {
  public static void main(String[] args) {
    try {
      Path path = Paths.get("/home/stark/eclipse-workspace-java/JavaArticles");

      Set<PosixFilePermission> filePerm = PosixFilePermissions.fromString("rwxrwxrwx");
      FileAttribute<Set<PosixFilePermission>> fileAttr =
          PosixFilePermissions.asFileAttribute(filePerm);

      Path temp = Files.createTempFile(path, "myTemp", ".tmp", fileAttr);
      System.out.print(temp);

      File file = new File(path.toString());
      file.deleteOnExit();
    } catch (IOException e) {
    }
  }
}

该代码使用了 createTempFile() 方法的所有四个参数。我们可以根据需要省略参数。

但是,请记住前缀参数不能省略。

如果我们省略 Path 参数,我们将使用方法的第一种多态形式,临时文件将保存到临时文件的默认目录。

如果我们省略 FileAttribute 参数,将使用默认权限创建文件。

该代码还使用 PosixFilePermissions 库使用简单的字符串定义文件权限。我们可以在这里阅读更多关于它的信息。

我们应该注意到 NIO 库没有自己的 deleteOnExit() 方法。因此,代码使用遗留的 IO 文件库来删除临时文件。

输出:

/home/stark/eclipse-workspace-java/JavaArticles/myTemp5731129001304860331.tmp

在 Java 中创建临时文件时要处理的隐藏异常

虽然我们已经看到用于创建临时文件的 Java 遗留 IO 库和 NIO 库方法抛出 IOException,但也有一些隐藏的异常我们应该牢记。

这些异常是隐藏的,因为它们不是使用方法本身直接引发的。由于方法内部的其他执行,这些反而被抛出。

  1. SecurityException:由于操作系统不允许程序创建临时文件,我们可以得到这个异常。
  2. IllegalArgumentException:当我们传递一些 Java 虚拟机无法识别的奇怪参数时,我们会得到这个异常。
  3. FileAlreadyExistsException:如果我们指定 CREATE_NEW 文件属性选项,并且文件已经存在,我们会收到此异常。
  4. UnsupportedOperationException:当我们指定了一个无法识别的文件属性时,该方法会抛出这个异常。

结论

在本文中,我们看到了两个不同的库来在 Java 中创建临时文件。Java 遗留 IO 库被广泛使用,但我们可以使用 NIO 库对文件权限进行更严格的控制。

但是,如果我们不指定文件是使用默认权限创建的,则它可能具有高度受限的权限。

相关文章 - Java File