FileWriter错误:java.io.FileNotFoundException:访问被拒绝

问题描述

我正在尝试将文本写入记事本文件,但出现此错误

java.io.FileNotFoundException: C:\Users\smart\Desktop\Atom Projects\Java Files\Graphics\passwordVault (Access is denied)

代码

   FileWriter fileWriter = null;
   BufferedWriter writetoFile = null;
   String password = "";

    password = passEncrypt(userPassword,encryptionKey,secEncryptionKey);

    try {
        
        fileWriter = new FileWriter("C:\\Users\\smart\\Desktop\\Atom Projects\\Java Files\\Graphics\\passwordVault");
        writetoFile = new BufferedWriter(writetoFile);
        writetoFile.write(password);
        writetoFile.close();

    } catch (IOException e) {
        e.printstacktrace();
    }
    
}

passEncrypt是另一种方法,但这不是我收到此错误的原因。我也曾尝试将此文件放在其他文件夹中并以管理员身份运行Eclipse,但仍然出现此错误

如果您知道如何解决此问题或如何以其他方式写入文件,将不胜感激。谢谢。

解决方法

“访问被拒绝”应该足够清楚。

您的代码存在一些问题:

  1. 如果捕获到异常,请对其进行处理。 “打印”不处理。特别是,您的代码现在将显示错误并继续执行,这很愚蠢;系统不再处于可靠状态。解决这个问题;通常,通过向您的方法添加“ throws IOException”。如果您不能执行此操作,并且不知道如何处理,则默认行为应为:throw new RuntimeException("unhandled",e);
  2. 有一个新的文件API具有一些重要的优点,我会使用它。
  3. FileWriter使用平台默认编码。我怀疑你想要那个。除非您指定,否则Files API始终使用UTF_8,因此我们不必在此不指定字符集。
  4. 必须使用try / finally块或try-with-resources关闭资源。

让我们结合一些修复方法来创建目录,因为这是您可能会收到此异常的原因之一:

Path p = Paths.get("C:\\Users\\smart\\Desktop\\Atom Projects\\Java Files\\Graphics");
Files.createDirectories(p);
try (var out = Files.newBufferedWriter(p.resolve("passwordVault")) {
    out.write(password);
}

如果仍然出现错误,或者现在createDirectories抛出了某些错误,那么Java进程就没有权限。以您自己的用户身份运行Java应用程序,或更改您写入的目录,或在资源管理器中右键单击这些文件夹并更改其访问权限。除了IIRC令人有些惊讶之外,如果目录不存在,则可能发生“拒绝访问”,这仅表示其含义:文件系统出于安全原因不允许您的Java进程写入该位置。