带有StandardOpenOption.CREATE的Files.newInputStream中的NoSuchFileException

时间:2016-11-21 22:14:39

标签: java nio

我正在尝试打开文件进行读取或创建文件(如果不存在)。 我使用这段代码:

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选项,如果文件不存在,则应该创建该文件。

知道我为什么会遇到这个例外吗?

3 个答案:

答案 0 :(得分:1)

似乎你想要发生两件完全不同的事情中的一件:

  1. 如果文件存在,请阅读;或
  2. 如果该文件不存在,请创建它。
  3. 这两件事是相互排斥的,但你似乎混淆了它们。如果文件不存在而您刚刚创建它,那么阅读它就没有意义了。因此,将两件事分开:

        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。

答案 1 :(得分:0)

根据JavaDocs您应该使用newOutputStream()方法,然后您将创建文件:

OutputStream out = Files.newOutputStream(confDir, StandardOpenOption.CREATE);
out.close();

的JavaDoc:

// 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常量使用依赖于您将在写入(输出)流或读取(输入)流中使用它。这解释了为什么OpenOption.CREATE仅适用于OutputStream,而不适用于InputStream

注意:我同意@EJP,您应该看一下Oracle's tutorials来正确创建文件。

答案 2 :(得分:0)

我认为您打算创建一个OutputStream(用于写入)而不是InputStream(用于阅读)

另一种创建空文件的方法是使用apache-commons FileUtils这样的

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