【问题标题】:java.io.FileNotFoundException on an existing file现有文件上的 java.io.FileNotFoundException
【发布时间】:2012-07-18 22:10:47
【问题描述】:

我在尝试打开文件时收到此错误:

java.io.FileNotFoundException: D:\Portable%20Programs\Android%20Development\workspace3\XXX-desktop\bin\World_X.fr (The system cannot find the path specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)

该文件存在于目录中,但我仍然收到此错误。但是,当我在 Eclipse 工作区 Project src 文件夹中复制相同的文件时,不会返回此类异常(尽管此方法还会在 bin 文件夹中创建 World_X.fr 文件)。

我实际上想要做的是通过这个获取 .jar 文件的绝对位置:

fileLocation = new String(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath());

然后我将“World_X.fr”附加到 fileLocation 字符串,但这不起作用。请在这方面帮助我。

【问题讨论】:

  • 你真的有包含“%20”的路径吗?
  • @DanielDiPaolo 是的!我在睡觉...... :)

标签: java filenotfoundexception java-io


【解决方案1】:

您需要将%20 转义为空格。例如:

fileLocation = new String(
    Main.class.getProtectionDomain().getCodeSource().getLocation().getPath())
    .replaceAll("%20", " ");

【讨论】:

    【解决方案2】:

    尝试省略 %20,并改用普通空格。此外,您使用的是反斜杠,如果您使用的是反斜杠,请确保在代码中先对其进行转义。

    【讨论】:

      【解决方案3】:

      file: URL 转换为实际File 的首选方法是:

      File file = new File(url.toURI());
      

      这会处理所有检查和引用/转义。

      改用getPath() 会将这些奇怪的位留给您。

      【讨论】:

        【解决方案4】:

        这里是解决方案,这个只能在JDK1.5之后使用,

        try { f = new File("somePath".toURI().getPath()); } catch(Exception e) {}
        

        【讨论】:

          【解决方案5】:

          已确认的解决方案已经很老了,尽管它适用于这种特殊情况,但使用 URLDecoder 要方便得多,因为 %20 只是一个编码字符,但在你的路径中可能有很多不同的编码字符。

          fileLocation = URLDecoder.decode(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多