使用Java 7的Files写入不存在的文件

4

你好,我尝试写入一个不存在的文件

public static void main(String[] args) throws IOException {
        Path newFile = Paths.get("output.txt");
        Files.write(newFile, "Sample text".getBytes());
}

而且一切都很好,但如果我加上选项。
Files.write(newFile, "Sample text".getBytes(),StandardOpenOption.DELETE_ON_CLOSE);

出现错误。
Exception in thread "main" java.nio.file.NoSuchFileException: problem.txt
    at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)

所以为了工作,我必须添加选项。
StandardOpenOption.CREATE_NEW

第一次尝试没有任何选项可以创建文件,但第二次使用StandardOpenOption.DELETE_ON_CLOSE选项时无法工作。 我正在使用Java版本(构建1.7.0_45-b18)。

请提供完整的代码。另外,您正在使用哪个JVM平台? - Pat
操作系统如何删除尚不存在的文件? - Thorn G
编辑并附上完整示例。 - Xelian
你试图通过在其他人有机会读取它之前编写并删除文件来实现什么目的? - Klitos Kyriacou
2个回答

5

来自Files.write的文档:

如果没有提供选项,则此方法的工作方式就像同时提供了CREATETRUNCATE_EXISTINGWRITE选项一样。

因此,一旦开始指定OpenOption,您还必须从这三个选项中指定所需的选项(或者如您已经注意到的那样,使用CREATE_NEW而不是CREATE)。


请注意:由于这是Files.write,即使省略了WRITE,也很可能默认为写入操作。 - Powerlord
在你的回答中,我省略了选项或者写了所有三个选项,问题已经消失。因此非常感谢。之前出现问题是因为指定了TRANCATE_EXISTING和WRITE,但没有指定CREATE。 - Tiina

1
根据文档
公共静态最终StandardOpenOption DELETE_ON_CLOSE 在关闭时删除。当存在此选项时,实现会尽最大努力在适当的关闭方法关闭文件时删除该文件。如果未调用关闭方法,则在Java虚拟机终止(通常由Java语言规范定义或在可能的情况下异常终止)时,将尽最大努力删除该文件。此选项主要用于仅由Java虚拟机的单个实例使用的工作文件。不建议在同时被其他实体并发打开的文件上使用此选项。关于何时以及如何删除文件的许多详细信息是特定于实现的,因此未指定。特别地,当文件处于打开状态时被攻击者替换时,实现可能无法保证删除预期文件。因此,对于安全敏感的应用程序,在使用此选项时应小心。
那么我们应该如何删除不存在的文件?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接