Java 在关闭时删除_的有用性
internet上有许多示例显示如何使用StandardOpenOption.DELETE\u on\u CLOSE,例如:Java 在关闭时删除_的有用性,java,nio,Java,Nio,internet上有许多示例显示如何使用StandardOpenOption.DELETE\u on\u CLOSE,例如: Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE); 其他示例同样使用文件.newOutputStream(…,StandardOpenOption.DELETE\u ON\u CLOSE) 我怀疑所有这些例子可能都有缺陷。编写文件的目的是在某个时候将其读回;否则,为什么还要写呢?但是在关闭时
Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE);
其他示例同样使用文件.newOutputStream(…,StandardOpenOption.DELETE\u ON\u CLOSE)
我怀疑所有这些例子可能都有缺陷。编写文件的目的是在某个时候将其读回;否则,为什么还要写呢?但是在关闭时删除会不会导致文件在您有机会阅读之前被删除
如果您创建了一个工作文件(用于处理太大而无法保存在内存中的大量数据),那么您是否会使用允许读写访问的RandomAccessFile
?但是,RandomAccessFile
没有给您指定DELETE\u ON\u CLOSE的选项,就我所见
那么,有人能告诉我“关闭时删除”实际上是如何有用的吗?该
DELETE\u ON\u CLOSE
用于处理临时文件
如果您需要执行一些需要临时存储在文件上的操作,但不需要在当前执行之外使用该文件,那么DELETE_on_CLOSE是一个很好的解决方案
例如,当您需要存储无法存储在内存中的信息时,例如,因为这些信息太重。
另一个例子是,当你需要暂时存储信息时,你只需要一秒钟,而你不想为此占用内存
再想象一下一个过程需要很多时间才能完成的情况。您将信息存储在一个文件中,然后才使用它们(可能是几分钟或几小时之后)。这保证了如果您不需要这些信息,内存不会用于这些信息
DELETE\u ON\u CLOSE
在调用方法CLOSE()
显式关闭该文件时,或者在JVM关闭时(如果之前没有手动关闭),尝试删除该文件。首先,我同意您的文件。写入(myTempFile,…,StandardOpenOption.DELETE\u ON\u CLOSE)
在本例中,使用DELETE\u ON\u CLOSE毫无意义。在互联网上进行了一次(不太激烈的)搜索之后,我能找到的唯一一个显示上述用法的示例就是您可能从中获得它的示例()
此选项不用于文件。仅写入(…)
。这一点很清楚:
此选项主要用于仅由Java虚拟机的单个实例使用的工作文件。打开由其他实体同时打开的文件时,不建议使用此选项
很抱歉,我不能给您一个有意义的简短示例,但可以看到这样的文件,比如操作系统使用的交换文件/分区。如果当前JVM需要在磁盘上临时存储数据,并且在关闭后,数据不再有用。作为一个实际的例子,我要提到它类似于JEE应用服务器,它可能决定将一些实体序列化到磁盘以释放内存
编辑以下(过于简化的代码)可以作为示例来演示该原理。(请大家注意:任何人都不应该开始讨论这种“数据管理”可以以不同的方式进行,使用固定的临时文件名是不好的,等等……)
- 在try-with-resource块中,您需要出于某种原因将数据外部化(原因不在讨论范围内)
- 您具有对此外部化数据的随机读/写访问权限
- 此外部化数据仅在try with资源块内使用
- 通过使用StandardOpenOption.DELETE\u ON\u CLOSE选项,您不需要在使用后自行处理删除操作,JVM将对此负责(API中描述了限制和边缘情况)
static final int RECORD_LENGTH=20;
静态最终字符串记录_格式=“%-”+记录_长度+“s”;
//添加异常处理,仅用于示例
公共静态void main(字符串[]args)引发异常{
EnumSet options=EnumSet.of(
StandardOpenOption.CREATE,
StandardOpenOption.WRITE,
StandardOpenOption.READ,
标准打开选项。在关闭时删除
);
Path file=Path.get(“/tmp/enternal_data.tmp”);
try(请参阅KableByteChannel sbc=Files.newByteChannel(文件,选项)){
//在您的业务处理过程中,可能会发生以下两种情况
//以随机顺序多次
//要外部化的大型数据结构示例
String[]sampleData={“some”,“mage”,“datastructure”};
对于(int i=0;i
这里有两种可能的使用方法:
1.打电话的时候
此方法返回一个适合读写的值,其中可以修改当前位置
对于某些数据需要存储在内存之外以进行读/写访问,并且在应用程序关闭后不需要持久化的情况,似乎非常有用
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));
这一结果(如预期的那样):
这个例子显然是错误的
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