Java 使用nio创建文件时出现NoSuchFileException
我试图使用JavaNIO创建一个新文件,但遇到了createFile错误。错误如下所示:Java 使用nio创建文件时出现NoSuchFileException,java,file-io,nio,Java,File Io,Nio,我试图使用JavaNIO创建一个新文件,但遇到了createFile错误。错误如下所示: createFile error: java.nio.file.NoSuchFileException: /Users/jchang/result_apache_log_parser_2015/06/09_10:53:49 String filename = "/Users/jchang/result_apache_log_parser_" + filename_date; Path
createFile error: java.nio.file.NoSuchFileException: /Users/jchang/result_apache_log_parser_2015/06/09_10:53:49
String filename = "/Users/jchang/result_apache_log_parser_" + filename_date;
Path file = Paths.get(filename);
try {
Files.createFile(file);
} catch (FileAlreadyExistsException x) {
System.err.format("file named %s" +
" already exists%n", file);
} catch (IOException x) {
System.err.format("createFile error: %s%n", x);
}
代码段如下所示:
createFile error: java.nio.file.NoSuchFileException: /Users/jchang/result_apache_log_parser_2015/06/09_10:53:49
String filename = "/Users/jchang/result_apache_log_parser_" + filename_date;
Path file = Paths.get(filename);
try {
Files.createFile(file);
} catch (FileAlreadyExistsException x) {
System.err.format("file named %s" +
" already exists%n", file);
} catch (IOException x) {
System.err.format("createFile error: %s%n", x);
}
有人知道怎么解决这个问题吗?谢谢你的帮助 我认为图灵85是正确的。您的
filename\u date
变量中有斜杠。因此/Users/jchang/result\u apache\u log\u parser\u 2015
必须作为目录存在。这就是导致NoSuchFileException
缺少目录的原因 您的代码至少有两个问题。第一:文件名中有路径分隔符(/
)。第二:至少在Windows下,您的解决方案在filname中包含非法字符(:
)
要解决第一个问题,可以采用两种方法:a)创建所需的所有文件夹或b)将分隔符更改为其他内容。我会解释两者
要创建指向某个路径的所有文件夹,只需调用
Files.createDirectories(path.getParent());
其中path
是一个文件(重要!)。通过调用file上的getParent()
,我们得到了path
所在的文件夹<代码>文件。CreateDirectory(…)处理其余部分
b) 更改分隔符:最简单的方法是:
String filename = "/Users/jchang/result_apache_log_parser_"
+ filename_date.replace("/", "_")
.replace(":", "_");
这将产生类似于/User/jchang/result\u apache\u parser\u 2015\u 06\u 09\u 10\u 53\u 29的结果
b)我们也解决了第二个问题
现在,让我们一起来设置并应用nio的一些小技巧:
String filename = "/Users/jchang/result_apache_log_parser_"
+ filename_date.replace('/', '_')
.replace(':', '_');
Path file = Paths.get(filename);
try {
// Create sub-directories, if needed.
Files.createDirectories(file.getParent());
// Create the file content.
byte[] fileContent = ...;
// We do not need to create the file manually, let NIO handle it.
Files.write(file
, fileContent
// Request permission to write the file
, StandardOpenOption.WRITE
// If the file exists, append new content
, StandardOpenOption.APPEND
// If the file does not exist, create it
, StandardOpenOption.CREATE);
} catch (IOException e) {
e.printStackTrace();
}
有关nio
的更多信息,请单击。正如许多人所说,您需要创建中间目录,如../06/
因此,在创建文件之前,请使用此选项创建不存在的目录
Files.createDirectories(mPath.getParent());
因此,您的代码应该是:
Path file = Paths.get(filename);
try {
Files.createDirectories(file.getParent());
Files.createFile(file);
} catch (FileAlreadyExistsException x) {
System.err.format("file named %s" +
" already exists%n", file);
} catch (IOException x) {
System.err.format("createFile error: %s%n", x);
}
文件。创建(…)
只创建文件,不创建文件夹。这可能是你的问题还是文件夹存在?哦,天哪,我到底需要文件类型吗?e、 g..txt?不,你没有。但是文件的路径(即文件所在的文件夹)必须存在。确定它确实存在,然后,我链接到的只是我的主目录。Files.createDirectories(file.getParent())代码>-您确定用户是用大写U编写的吗?但还有一个问题(至少在windows下):冒号是非法字符。我正在研究一个解决方案。很明显,我还建议将filename\u date
中的一些字符替换为有效字符。例如,filename\u data=filename\u date.replace(“/”,“\u”).replace(“:”,“\u”)代码>太棒了,这就解决了它。谢谢,为我工作。