当我运行一个应该从 Eclipse 中读取文件的 Java 应用程序时,我得到一个 java.io.FileNotFoundException
,即使该文件位于正确的目录中。我可以从命令行编译和运行应用程序就好了;该问题仅发生在 Eclipse 中,具有多个项目和应用程序。我需要在运行配置或构建路径中更改设置以使其正确找到文件吗?
最佳答案
问题很可能是您的应用程序使用了相对路径名。正如@BalusC 所说,相对路径名可能有问题。但是 IMO,当他说 “[y]你不应该永远在 java.io 的东西中使用相对路径”时,他走得太远了。
当应用程序使用(例如)FileInputStream(File)
构造函数打开文件时,相对路径名将在 javadoc File.getAbsolutePath()
中描述的过程中相对于“当前目录”进行解析.
[...] Otherwise this pathname is resolved in a system-dependent way. On UNIX systems, a relative pathname is made absolute by resolving it against the current user directory. On Microsoft Windows systems, a relative pathname is made absolute by resolving it against the current directory of the drive named by the pathname, if any; if not, it is resolved against the current user directory.
因此,我们立即看到“当前目录”的概念在 Windows 和 UNIX 平台上有不同的细微差别。第二个问题是,在纯 Java 中,您无法确定当前目录是什么,而且您当然无法为使用纯 Java 的当前 JVM 更改它。 (当 JVM 启动时,“user.dir”系统属性设置为当前目录,但是没有什么可以阻止应用程序更改属性,因此您不能完全依赖它。此外,更改“user.dir”只会改变解析空路径的方式,一般不会改变相对路径。)
那么你应该怎么做呢?
一种选择是使用绝对路径名来引用文件。这在(几乎)所有情况下都是可靠的,但是如果用户必须输入路径名,则使用绝对路径名可能会出现问题,或者 如果您需要避免硬连线(或配置)绝对路径名。
第二个选项是使用类路径相对路径名并定位相对于应用程序安装目录的文件。如果这是您需要做的,这可以工作,但如果您需要将
File
传递给某个库方法,则会出现问题。如果您试图查找用户的应用程序首选项,它也无济于事。 (一般情况下,将用户偏好放入安装目录是错误的……)第三种选择是相对于从其他地方获得的某个绝对目录来命名文件;例如
new File(System.getProperty("home.dir"), "foo/bar");
.最后的选择是使用相对路径名,并假设用户知道当前目录是什么。对于用户从命令行运行的许多应用程序,这是正确的解决方案。
在 Eclipse 的特殊情况下,有一个简单的解决方案。转到用于启动应用程序的“运行配置”,打开“参数”选项卡,然后单击“其他”单选按钮。然后输入一个绝对路径名作为启动应用程序的工作目录。子 JVM 启动时,会将指定的工作目录作为当前目录。
关于Java通过Eclipse运行时找不到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792870/