我正在尝试使用java nio创建一个新文件,而且我遇到了一个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 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);
}
任何人都知道如何解决这个问题?谢谢你的帮助!
答案 0 :(得分:6)
我会说图灵85是正确的。您的filename_date
变量中包含斜杠。所以/Users/jchang/result_apache_log_parser_2015
必须作为目录存在。这是NoSuchFileException
,缺少目录的原因。
答案 1 :(得分:3)
您的代码至少有两个问题。首先:您的文件名中包含路径分隔符(/
)。第二:至少在Windows下,您的解决方案在filname(:
)中包含非法字符。
要解决第一个问题,您可以选择两条路线:a)创建您需要的所有文件夹,或者b)将分隔符更改为不同的分隔符。我会解释两者。
要创建路径的所有文件夹,只需调用
即可Files.createDirectories(path.getParent());
其中path
是一个文件(重要!)。通过调用getParent()
文件,我们将获得path
所在的文件夹。 Files.createDirectories(...)
负责其余的工作。
b)更改分隔符:没有比这更容易的了:
String filename = "/Users/jchang/result_apache_log_parser_"
+ filename_date.replace("/", "_")
.replace(":", "_");
这应该会产生类似/User/jchang/result_apache_parser_2015_06_09_10_53_29
我们已经解决了第二个问题。
现在让我们一起设置并应用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
点击here。
答案 2 :(得分:2)
正如许多人所说,你需要创建中间目录,比如../ 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);
}