首先,我同意你的看法,
Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE)
在这个例子中使用 DELETE_ON_CLOSE 是没有意义的。在互联网上进行了(不算太强烈的)搜索后,我唯一找到的一个显示出所提到用法的例子是你可能从中获取的(
http://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/)。
这个选项不仅适用于
Files.write(...)
。
API 很清楚地说明了:
该选项主要用于仅由 Java 虚拟机的单个实例使用的 工作文件。不建议在同时被其他实体并发打开的文件上使用此选项。
抱歉我不能给您一个有意义的简短示例,但是可以将这样的文件视为操作系统使用的交换文件/分区。在当前JVM需要临时将数据存储到磁盘上,并在关闭后数据不再使用的情况下。实际的例子是类似于JEE应用程序服务器可能会决定将一些实体序列化到磁盘上以释放内存。
编辑:也许以下(过度简化的代码)可以作为示例来演示原理。(因此请:没有人应该开始讨论这个“数据管理”可以使用固定的临时文件名进行处理,删除选项关闭后JVM会自动处理等等...)
在try-with-resource块中,由于某种原因,您需要将数据外部化(原因不是讨论的主题)
您可以随机读/写访问此外部化数据
此外部化数据仅在try-with-resource块内有用
通过使用StandardOpenOption.DELETE_ON_CLOSE选项,您无需自己处理使用后的删除,JVM会负责处理(限制和边缘情况在API中描述)。
.
static final int RECORD_LENGTH = 20;
static final String RECORD_FORMAT = "%-" + RECORD_LENGTH + "s";
public static void main(String[] args) throws Exception {
EnumSet<StandardOpenOption> options = EnumSet.of(
StandardOpenOption.CREATE,
StandardOpenOption.WRITE,
StandardOpenOption.READ,
StandardOpenOption.DELETE_ON_CLOSE
);
Path file = Paths.get("/tmp/enternal_data.tmp");
try (SeekableByteChannel sbc = Files.newByteChannel(file, options)) {
String[] sampleData = {"some", "huge", "datastructure"};
for (int i = 0; i < sampleData.length; i++) {
byte[] buffer = String.format(RECORD_FORMAT, sampleData[i])
.getBytes();
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
sbc.position(i * RECORD_LENGTH);
sbc.write(byteBuffer);
}
Random random = new Random();
byte[] buffer = new byte[RECORD_LENGTH];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
for (int i = 0; i < 10; i++) {
sbc.position(RECORD_LENGTH * random.nextInt(sampleData.length));
sbc.read(byteBuffer);
byteBuffer.flip();
System.out.printf("loop: %d %s%n", i, new String(buffer));
}
}
}
DELETE_ON_CLOSE
而不是旧的File.deleteOnExit
方法,但它们并不相同! - daiscogFile.deleteOnExit
已被“在createFile方法中指定的DELETE_ON_CLOSE选项所取代。”这是完全错误的。createFile方法并不接受DELETE_ON_CLOSE参数。 - Klitos KyriacouFile.deleteOnExit
方法在新的java.nio.file
API中实际上没有合适的替代方法,这意味着在某些情况下转移到新的API是不可能的。 - daiscog