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

Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE);

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

我怀疑所有这些示例可能都是有缺陷的。写入文件的目的是要在某个时候将其读回。否则,为什么还要写呢?但是,在您有机会读取文件之前,DELETE_ON_CLOSE不会导致文件被删除吗?

如果创建工作文件(要处理太大而无法保存在内存中的大量数据),那么您是否会使用RandomAccessFile来代替,它允许读取和写入访问?但是,据我所知,RandomAccessFile没有为您提供指定DELETE_ON_CLOSE的选项。

那么有人可以告诉我DELETE_ON_CLOSE实际上是有用的吗?

最佳答案

有两种可能的使用方式:

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));

输出(如预期):
false
true
Hello, World!
false

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

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

关于java - DELETE_ON_CLOSE的用处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34353532/

10-10 08:01