我正在尝试打开文件进行读取或创建文件(如果不存在)。 我使用这段代码:
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
选项,如果文件不存在,则应该创建该文件。
知道我为什么会遇到这个例外吗?
答案 0 :(得分:1)
似乎你想要发生两件完全不同的事情中的一件:
这两件事是相互排斥的,但你似乎混淆了它们。如果文件不存在而您刚刚创建它,那么阅读它就没有意义了。因此,将两件事分开:
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"));