DELETE_ON_CLOSE的用处

Kli*_*cou 9 java nio

互联网上有很多例子显示如何使用StandardOpenOption.DELETE_ON_CLOSE,例如:

Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)

其他示例类似地使用Files.newOutputStream(..., StandardOpenOption.DELETE_ON_CLOSE).

我怀疑所有这些例子都可能存在缺陷.写一个文件的目的是你要在某个时候读回来; 否则,为什么还要写呢?但是,在您有机会阅读之前,DELETE_ON_CLOSE会不会导致文件被删除?

如果你创建一个工作文件(用于处理太大而无法保留在内存中的大量数据),那么你不会使用RandomAccessFile它,它允许读写访问吗?但是,RandomAccessFile据我所知,并没有为您提供指定DELETE_ON_CLOSE的选项.

那么有人能告诉我DELETE_ON_CLOSE 实际上有用吗?

meg*_*lop 1

以下是它的两种可能的使用方式:

1.调用Files.newByteChannel时

该方法返回一个适合读写的 SeekableByteChannel ,其中当前位置可以修改。

对于需要将某些数据存储在内存之外以进行读/写访问并且在应用程序关闭后不需要保留的情况似乎非常有用。

2. 写入文件、读回、删除:

使用任意文本文件的示例:

Path p = Paths.get("C:\\test", "foo.txt");
System.out.println(Files.exists(p));
try {
    Files.createFile(p);
    System.out.println(Files.exists(p));
    try (BufferedWriter out = Files.newBufferedWriter(p, Charset.defaultCharset(), StandardOpenOption.DELETE_ON_CLOSE)) {
        out.append("Hello, World!");
        out.flush();
        try (BufferedReader in = Files.newBufferedReader(p, Charset.defaultCharset())) {
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
System.out.println(Files.exists(p));
Run Code Online (Sandbox Code Playgroud)

输出(如预期):

false
true
Hello, World!
false
Run Code Online (Sandbox Code Playgroud)

这个例子显然是微不足道的,但我想在很多情况下这种方法可能会派上用场。

但是,我仍然相信旧File.deleteOnExit方法可能更可取,因为您也不需要在文件上的任何读取操作期间保持输出流打开。