FileOutputStream上的FileNotFoundException尽管有mkdirs()和createNewFile()

Pao*_*one 1 java file

我有一个从SMTP服务器下载电子邮件的bean.阅读电子邮件后,它会在服务器上保存附件.要阅读附件,我使用以下代码:

File f = new File("\\attachments\\" + attachment.getFileName());
f.mkdirs();
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(bytes);
fos.close();
Run Code Online (Sandbox Code Playgroud)

我在FileOutputStream上创建了一个FileNotFoundException,我无法理解为什么.如果可以提供帮助,我将NetBeans与GlassFish一起使用,并在本地计算机上进行调试.

Cyr*_* Ka 6

当你这样做

f.mkdirs();
Run Code Online (Sandbox Code Playgroud)

您正在创建一个包含文件名的目录(也就是说,您不仅创建了"附件"目录,还创建了一个带有附件文件名的子目录).然后

f.createNewFile();
Run Code Online (Sandbox Code Playgroud)

由于文件已经存在(以您刚刚创建的目录的形式),因此不执行任何操作.它返回false以告诉您该文件已存在.

然后这失败了:

FileOutputStream fos = new FileOutputStream(f);
Run Code Online (Sandbox Code Playgroud)

您正在尝试在目录上打开输出流.系统不允许您在目录中写入,因此失败.

底线是:

  • mkdirs() 不会做你认为它做的事情.
  • 你应该检查你的电话的返回值createNewFile().

使其工作的最简单方法是将您的行替换为:

f.getParentFile().mkdirs();
Run Code Online (Sandbox Code Playgroud)