【问题标题】:Java can't read file except when in project root directoryJava无法读取文件,除非在项目根目录中
【发布时间】:2016-07-27 15:15:53
【问题描述】:

我正在使用 IDEA 14 来学习一个简单的 Java 教程 (JDBC)。作为其中的一部分,我将一些配置属性存储在一个名为 jdbcTutorial.properties 的文件中。当我把它放在项目的根目录中时,我可以使用以下内容阅读它:

Properties props = new Properties();
props.load(new FileInputStream("jdbcTutorial.properties"));

但是,一旦我将它移动到项目中的任何其他目录,我就会收到错误 "No such file or directory"无论我指定相对路径还是绝对路径,都会发生这种情况:

也许有更多使用配置文件的标准方法,但我真的很想了解我观察到的行为。感谢您的帮助!

【问题讨论】:

  • 它说“FileNotFoundException: jdbcTutorial.properties”而不是“FileNotFoundException: /Users/****/jdbcTutorial/resources/jdbcTutorial.properties”。这意味着您正在执行的版本不是您在源窗口中显示的版本。尝试完全清理并重新构建。
  • 重建和失效缓存没有帮助,但我确实让它工作了,虽然我只是半理解。我在项目结构中指定了一个 JAR 工件。当我删除它时,我注意到我收到了另一个错误,即找不到 JAR。所以大概当你点击“运行”时,如果你有一个 jar,它会执行那个工件,而不是编译和执行你的源代码。所以我不得不再次构建那个工件,然后运行,它可以工作(找到文件)。我会做更多关于这个的阅读,谢谢!

标签: java intellij-idea


【解决方案1】:

默认情况下,根目录将添加到项目的构建路径中。由于您放置文件的目录未添加到项目的构建路径中,因此 jvm 无法找到该文件。您有两个选择:

  1. 将放置道具的文件夹添加到构建路径。
  2. 使用完整路径访问文件,即 /home/user/workspace/....

【讨论】:

  • 感谢您的快速回复 - 我在上面进一步强调,即使指定了绝对路径也会发生这种情况。
【解决方案2】:

当你构建一个项目时,IDEA 会获取资源目录中的文件并将它们放入可执行 jar 中。因此,要从该文件中获取输入流,您需要直接从 jar 中获取它。使用

代替 FileInputStream
getClass().getResourceAsStream("jdbcTutorial.properties")

【讨论】:

  • 我会看一下,我认为您提出了一种更好的方法,但我很好奇为什么会发生我看到的具体问题。我认为 JAR 仍然可以读取我正在使用 FileInputStream 读取的外部文件。我认为我得到的错误是因为我没有重新构建 JAR。 “运行”功能为您提供了几个选项 - 从 main 方法运行,或运行您之前构建的 JAR。我的旧 JAR 不包含在这个新目录中查找文件的代码更改。当我重建 JAR 或从 main 运行时,它运行良好。我也会更多地研究你的建议!
  • 是的,jar 确实可以读取外部文件。您的问题是,IDEA 运行 jar 时,默认目录是项目根目录,因此找不到资源目录中的文件。
【解决方案3】:

当没有为文件提供路径时,java 假定该文件位于项目的根文件夹中。所以相对路径“。”总是指向这个文件夹。当文件位于其他位置时,将适当的相对路径放在路径名之前,例如“./files/configuration/jdbcTutorial.properties”。

当您在路径名之前放置一个绝对文件路径时,它也可以工作,例如“C:/Users/Me/Documents/Java/workspace/thisProject/files/configuration/jdbcTutorial.properties”。

【讨论】:

  • 感谢您的快速回复 - 我在上面进一步强调,即使指定了绝对路径也会发生这种情况。
  • 执行 System.out.println(new File("jdbcTutorial.properties").getAbsolutePath());找出系统假定文件的位置。
  • 也许绝对文件路径开头的驱动器规范(“C:”或“D:”)丢失?
  • 不,我在 Mac 上
  • 我明白了。好的,然后将System.out.println(new File("jdbcTutorial.properties").getAbsolutePath()); 行作为main() 中的第一行,以找出系统假定文件所在的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多