Java 在通过 Eclipse 运行时找不到文件
当我运行一个应该从 Eclipse 中的文件读取的 Java 应用程序时,我得到一个 ,即使该文件位于正确的目录中。我可以从命令行编译和运行应用程序就好了;这个问题只发生在 Eclipse 中,有多个项目和应用程序。是否需要在运行配置或生成路径中更改设置才能使其正确查找文件?java.io.FileNotFoundException
当我运行一个应该从 Eclipse 中的文件读取的 Java 应用程序时,我得到一个 ,即使该文件位于正确的目录中。我可以从命令行编译和运行应用程序就好了;这个问题只发生在 Eclipse 中,有多个项目和应用程序。是否需要在运行配置或生成路径中更改设置才能使其正确查找文件?java.io.FileNotFoundException
问题很可能是您的应用程序正在使用相对路径名。正如@BalusC所说,相对路径名可能会有问题。但是IMO,当他说“你们永远不应该在 java.io 的东西中使用相对路径”时,他走得太远了。
当应用程序使用(例如)构造函数打开文件时,相对于“当前目录”的进程解析相对路径名,如下所述,如 File.getAbsolutePath()
的 javadoc 中所述。FileInputStream(File)
[...]否则,此路径名将以依赖于系统的方式进行解析。在 UNIX 系统上,通过针对当前用户目录解析相对路径名,可以将其变为绝对路径名。在 Microsoft Windows 系统上,通过针对由路径名命名的驱动器的当前目录(如果有)解析相对路径名,使相对路径名成为绝对路径名。如果不是,则针对当前用户目录进行解析。
因此,我们立即看到“当前目录”的概念在Windows和UNIX平台上具有不同的细微差别。第二个问题是,在纯Java中,您无法明确地找出当前目录是什么,并且您当然无法使用纯Java为当前JVM更改它。(当 JVM 启动时,“user.dir”系统属性设置为当前目录,但没有什么可以阻止应用程序更改该属性,因此您无法完全依赖它。此外,更改“user.dir”只会更改空路径的解析方式,而不是一般的相对路径。
那么你应该怎么做呢?
一种选择是使用绝对路径名来引用文件。这在(几乎)所有情况下都是可靠的,但是如果用户必须输入路径名,或者您需要避免硬连线(或配置的)绝对路径名,则使用绝对路径名可能会有问题。
第二个选项是使用类路径相对路径名并查找相对于应用程序安装目录的文件。如果这是您需要执行的操作,则此方法有效,但是如果您需要将 a 传递给某个库的方法,则会出现问题。如果您尝试查找用户的应用程序首选项,这也无济于事。(通常,将用户首选项放入安装目录是一个错误...)File
第三种选择是相对于您从其他地方获得的某个绝对目录命名文件;例如.new File(System.getProperty("home.dir"), "foo/bar");
最后一个选项是使用相对路径名,并假设用户知道当前目录是什么。对于用户从命令行运行的许多应用程序,这是正确的解决方案。
在Eclipse的特定情况下,有一个简单的解决方案。转到用于启动应用程序的“运行配置”,打开“参数”选项卡,然后单击“其他”单选按钮。然后输入绝对路径名作为已启动应用程序的工作目录。当子 JVM 启动时,它将具有指定的工作目录作为其当前目录。
另一种选择是简单地找出“当前路径”指向环境中的目录 - 无论该目录是什么。一旦你弄清楚了,你可以从那里选择你的解决方案。也许这是使用文件位置的适当相对路径或重新定位文件。
File testFile = new File("");
String currentPath = testFile.getAbsolutePath();
System.out.println("current path is: " + currentPath);