【问题标题】:Invalid file path exception无效文件路径异常
【发布时间】:2024-01-21 14:22:01
【问题描述】:

我的应用程序引发异常 - java.io.FileNotFoundException:文件路径无效。不知道为什么。我已阅读有关该主题的问题和答案,但没有人可以帮助我。

代码如下:

    String userhome = System.getProperty("user.home");
    String filename = null;
    File rdp = null;
    for (int item = 0; item < darab; item++) {
        filename = toValidFileName(ProgramList.get(item).getP_name());
        filename += ".rdp";
        rdp = new File(userhome, filename);
        try {
            JFrame panel;
            panel = new JFrame();
            panel.setSize(400, 10);
            panel.setLocation(300, 400);
            panel.setTitle("Saving " + rdp.getAbsolutePath());

            try (FileOutputStream fstr = new FileOutputStream(rdp)) {
                panel.setVisible(true);
                char c;
                for (int j = 0; j < 2336; j++) {
                    c = ProgramList.get(item).p_body.charAt(j);
                    fstr.write(c);
                }
                fstr.flush();
                fstr.close();
                panel.setVisible(false);
            }

        } catch (IOException ioe) {
            JOptionPane.showMessageDialog(this,
                    ioe.getMessage(), "Save rdp file", JOptionPane.ERROR_MESSAGE);
            System.err.println(ioe.getMessage() + " : "+ rdp.getAbsoluteFile());
        }
    }

结果: 文件路径无效:C:\Users\LiPI\CosmicLd.rdp

toValidFilename() 是从 (KORG RADIAS) 程序名称中删除禁止的字符以创建一个有效的文件名。

我没有发现我的错 :( 目标目录不是只读的,用户有必要的权限。当我在该行之后查看 file.canWrite() 时: rdp = 新文件(用户主目录,文件名); 它总是错误的。 我做错了什么? 谢谢!

【问题讨论】:

  • 如果我选择了一个文件供文件选择器写入,它就可以了。
  • 你会发布堆栈跟踪和 toValidFileName 代码吗?
  • 请选择与文件选择器相同的文件并打印文件名。将名称与失败的名称进行比较。注意空格。
  • System.out.println(filename.length()); 打印什么?我怀疑你的文件名中可能有不可见的控制字符。
  • 能否请您从文件资源管理器中复制路径并将其作为变量传递,看看它是否有效!如果它有效,则您的 toValidFileName() 有问题,如果不是文件或其他问题。

标签: java java-7 netbeans-8.2


【解决方案1】:

尝试改用文件写入器。您的尝试将如下所示:

try {
     File dir = new File("C:/Users//" + userhome + "/Documents"); //customize this however
     FileWriter fstr = new FileWriter(new File(dir, rdp));
          for (int j = 0; j < 2336; j++) {
                c = ProgramList.get(item).p_body.charAt(j);
                fstr.write(c);
                        }
            fw.close(); 
        }

此外,请尝试遵守 Java 变量命名约定。 userhome 应该是 userHome 等等。只是一件小事:)

【讨论】:

  • 为什么你认为这会在这种情况下有所帮助?
  • Filewriter 向我证明了它的逻辑性和直接性。我希望简化的输入能够解决问题,因为我最好的选择是他们的代码没有生成/读取正确的路径。
【解决方案2】:

问题是在那一行产生的:

filename = toValidFileName(ProgramList.get(item).getP_name());

使用 getP_name() 结果,因为有时它有 (char) 0 个字符...

代码被重写 -> 对象中的 (char) 0 个字符更改为 (char) 20 个字符,这样一切正常。

toValidFileName 代码无论如何都是这样的:

public static String toValidFileName(String input) {
    return input.replaceAll("[:\\\\/*\"?|<>']", "_");
}

感谢大家的帮助!有一些有用的建议,尤其是 Arkady 和 VGR 的建议!

【讨论】: