DELETE_ON_CLOSE 的用处

2024-04-25

互联网上有很多示例展示如何使用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 是如何的吗actually useful?


首先我同意你的观点Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE)在此示例中,使用 DELETE_ON_CLOSE 是没有意义的。经过(不是那么激烈的)互联网搜索后,我能找到的唯一显示上述用法的示例就是您可能从中得到的示例(http://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/ http://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/).

该选项不适用于Files.write(...)仅有的。这API https://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardOpenOption.html#DELETE_ON_CLOSEmake 说得很清楚:

该选项主要用于与工作文件仅由 Java 虚拟机的单个实例使用。当打开由其他实体同时打开的文件时,不建议使用此选项。

抱歉,我无法给您提供一个有意义的简短示例,但请参阅操作系统使用的交换文件/分区等文件。如果当前的 JVM 需要在磁盘上临时存储数据,并且关闭后数据就不再有用。作为实际示例,我会提到它类似于 JEE 应用程序服务器,它可能决定将某些实体序列化到磁盘以释放内存。

edit也许可以用以下(过于简化的代码)为例来演示原理。 (所以请:没有人应该开始讨论这种“数据管理”可以以不同的方式完成,使用固定的临时文件名是不好的等等,......)

  • 在 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";

// add exception handling, left out only for the example
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)) {

        // during your business processing the below two cases might happen
        // several times in random order

        // example of huge datastructure to externalize
        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);
        }

        // example of processing which need the externalized data
        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));
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DELETE_ON_CLOSE 的用处 的相关文章

随机推荐

  • 创建当前日期的查询匹配[重复]

    这个问题在这里已经有答案了 可能的重复 在 JPA 查询中使用 CURRENT DATE 的示例 https stackoverflow com questions 1637323 example of using current date
  • ASP.Net Identity 2.0:用户是System.Web.Security.RolePrincipal,为什么?

    我正在尝试在现有应用程序中实现 Asp Net Identity 2 0 OWIN 但在角色方面我遇到了各种麻烦 我从项目模板创建了一个示例项目 并且 据我所知 我已将其中的所有内容复制到我的应用程序中 我修改了连接信息 以便身份验证表来自
  • .Net 与 Java 垃圾收集器

    有谁知道 Java 和 Net 垃圾收集器之间的主要区别 网上搜索并没有透露太多信息 这是一个测试中出现的问题 区别在于 CLR Net GC 和 JVM GC 之间 而不是语言本身 两者都可能发生变化 并且其行为规范宽松 允许在不影响程序
  • ASP.NET MVC 路由中的通配符

    我正在使用 asp net mvc 与 vs2008 和 IIS7 我想要完成的是所有以 summer 开头的请求都路由到同一个控制器 到目前为止 我已经构建了大量的路线 但它们都是针对一条路径的 带有偏离参数的路径 但这条路线必须路由 w
  • 将输入类型数限制为角度 2 中的小数点后 2 位

    我在一个html页面上有很多输入框 我想限制用户输入小数点后两位后的任何数字 目前尝试应用 html 5 input Step 0 00 但不起作用 任何打字稿解决方案也可以 请参阅以下指令的演示Plnkr https plnkr co e
  • JPQL 和联接表

    我对 SQL 和 JPQL 的理解不是很好 我一直在尝试创建以下 sql 语句的 JPQL 查询 select group from user user group group where user group user id user i
  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • 最大覆盖不相交间隔

    假设您有 k 无法尝试所有可能的子集 2 k 不可行 贪婪方法按 a i 区间覆盖算法 排序 按 b i 最大不相交区间数算法 排序不起作用 不知道是否有动态程序解决方案 考虑到输入的大小 我认为解决方案应该是 O k log k 或 O
  • JavaScript 中的奇怪字符导致其无法加载

    我的网站在本地主机上运行良好 我的 JavaScript 正在加载并运行良好 但是当我部署站点时 脚本不起作用 当我右键单击页面并说查看源代码 然后查看链接的脚本文件时 文件开头有一些奇怪的字符 函数 在本地主机上 我的脚本文件像这样开始
  • 如何在powerpoint vba中制作进度条?

    如何使用 PowerPoint VBA 制作进度条 它应该作为幻灯片上的动画来完成 这是您要找的吗 http www pptfaq com FAQ00597 htm http www pptfaq com FAQ00597 htm
  • `npm i` 命令有什么作用?

    什么是i在 npm CLI 中执行命令 我看到它是这样使用的 npm i package The iflag 是一个别名install so npm i package 是相同的 npm install package 从文档中 npm i
  • 如何创建可以跨多个页面或在框架/iframe 内访问的全局 JSP 变量?

    简而言之 如何在 JSP 中创建全局变量 以便可以跨其他 JSP 页面和 或内部框架 iframe 访问它 我尝试了 但出现错误 无法在单独的 jsp 页面中解析该变量 是否有可能在多个页面中访问 JSP 变量而无需求助于查询字符串 会话变
  • git tag -l 不会删除已删除的标签

    这是场景 我将我的存储库克隆到一个定期更新的目录 git pull 现在我又创建了一个目录并签出了相同的存储库 我必须创建一些标签 但我错误地创建了名称错误的标签 所以我从第一个目录中删除了标签 git tag d old git push
  • 错误:SPAN_EXCLUSIVE_EXCLUSIVE 跨度的长度不能为零

    我的 Android 应用程序出现问题 我有一个按钮和一个关联的事件 但是当我第一次单击时出现错误 跨度不能有零长度 但是当我第二次单击时 事件 onclick 运行良好 看看我的java代码 public class MainActivi
  • 如何调试 Apache mod_rewrite

    我对 mod rewrite 有两个主要问题 当我的规则无效时 不会报告任何有意义的错误 To reliably test each modification I have to erase Google Chrome s cache Th
  • 新的 Basecamp api 告诉我该地址没有 Basecamp 帐户

    我是 Basecamp api 的新手 在尝试最简单的示例时 curl u user pass H User Agent MyApp email protected cdn cgi l email protection https base
  • Pyspark 删除数据帧列中的多个字符

    看看 pyspark 我明白了translate and regexp replace帮助我了解数据框列中存在的单个字符 我想知道是否有一种方法可以在regexp replace or translate这样它就会解析它们并用其他东西替换它
  • 谁能解释一下这些 XSS 测试字符串吗?

    最近我发现了这个关于 XSS 和 Web 应用程序安全的教程 gt https www owasp org index php XSS Filter Evasion Cheat Sheet XSS Locator https www owa
  • 你能帮我使用 Selenium 单击“添加到购物车”按钮吗?

    我正在尝试做一个教程并在 python 中学习 Selenium 但是我似乎无法让 Selenium 使用 find element by class 或 find element by XPATH 单击 添加到购物车 按钮 问题是检查商品
  • DELETE_ON_CLOSE 的用处

    互联网上有很多示例展示如何使用StandardOpenOption DELETE ON CLOSE 例如 Files write myTempFile StandardOpenOption DELETE ON CLOSE 其他例子类似地使用