在使用Files.newInputStream和StandardOpenOption.CREATE时出现NoSuchFileException异常

10

我想打开一个文件进行读取,如果该文件不存在,则创建该文件。 我使用以下代码:

String location = "/test1/test2/test3/";
new File(location).mkdirs();
location += "fileName.properties";
Path confDir = Paths.get(location);
InputStream in = Files.newInputStream(confDir, StandardOpenOption.CREATE);
in.close();

我收到了 java.nio.file.NoSuchFileException 的错误。

考虑到我正在使用 StandardOpenOption.CREATE 选项,如果文件不存在,应该会创建该文件。

你有任何想法为什么会出现这个异常吗?


1
创建一个空文件只为了读取它并没有太多意义。 - user207421
1
换句话说,CREATE 选项被忽略了 - javadoc 只考虑 READ 选项(默认),其他选项可能会得到支持(具体实现有关)。 - user85421
3个回答

2
根据JavaDocs的规定,您应该使用newOutputStream()方法,然后就可以创建文件了。请注意保留HTML标签。
OutputStream out = Files.newOutputStream(confDir, StandardOpenOption.CREATE);
out.close();

JavaDocs:

// Opens a file, returning an input stream to read from the file.
static InputStream newInputStream(Path path, OpenOption... options)

// Opens or creates a file, returning an output stream that
// may be used to write bytes to the file.
static OutputStream newOutputStream(Path path, OpenOption... options)

解释是,OpenOption 常量的使用取决于您将在写入(output)流还是读取(input)流中使用它。这就解释了为什么 OpenOption.CREATE 仅与 OutputStream 搭配使用,而不是与 InputStream 搭配使用。

注意:我同意 @EJP 的观点,您应该查看 Oracle 的教程,以正确创建文件。


2

看起来你想要发生两件完全不同的事情之一:

  1. 如果文件存在,则读取它;或者
  2. 如果文件不存在,则创建它。

这两个事情是互相排斥的,但你似乎把它们混淆了。如果文件不存在并且你刚刚创建了它,那么读取它就没有意义了。因此,请将这两个事情分开处理:

    Path confDir = Paths.get("/test1/test2/test3");
    Files.createDirectories(confDir);
    Path confFile = confDir.resolve("filename.properties");

    if (Files.exists(confFile))
        try (InputStream in = Files.newInputStream(confFile)) {
            // Use the InputStream...
        }
    else
        Files.createFile(confFile);

请注意,最好使用“try-with-resources”而不是手动关闭InputStream。

我喜欢你的解决方案。我只是不理解你最后的提示:“最好使用“try-with-resources”而不是手动关闭InputStream”。你能解释一下吗? - Arashsoft
我在互联网上搜索到了它。Java 7的一个不错的特性。谢谢。 - Arashsoft
这个答案并没有回答你的问题,但是它可以帮助你改进你的代码,而不是忽略你所处理的问题的原因。@Arashsoft - another
@Roizpi,我认为这篇文章恰好回答了我的问题。其他答案都有一个假设,即我想在文件中写入一些内容。这是一个错误的假设。我想读取文件,如果文件不存在,就在那里创建一个空文件。我与“OutputStream”无关。 - Arashsoft
无论如何。下一个使用者来到这个主题,都是因为你的问题和给出的错误,而不是代码的丑陋,因为有许多适用的解决方案。无论什么是最好的答案,都不管你的代码是否正确,因为你没有要求它。建议非常重要,这就是为什么有一个“投票”按钮。祝你好运,学习愉快。 - another
显示剩余2条评论

0

我认为你想要创建一个OutputStream(用于写入),而不是一个InputStream(用于读取)

另一种创建空文件的便捷方法是使用{{link1:apache-commons FileUtils}},像这样

FileUtils.touch(new File("/test1/test2/test3/fileName.properties"));

2
为什么不使用标准的Java 7 Files.createFile(Path)函数呢? - user85421

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