当前位置: 首页 > 面试题库 >

通过Eclipse运行时Java无法找到文件

公羊俊德
2023-03-14
问题内容

当我运行应从Eclipse中的文件读取的Java应用程序时java.io.FileNotFoundException,即使文件位于正确的目录中,我也会得到一个。我可以从命令行编译并运行应用程序;该问题仅在具有多个项目和应用程序的Eclipse中发生。是否需要更改运行配置或构建路径中的设置才能使其正确找到文件?


问题答案:

问题很可能是您的应用程序正在使用相对路径名。正如@BalusC所说,相对路径名可能会出现问题。但是IMO,当他说 _“您 永远不要
在java.io内容中使用相对路径”_时,他走得太远了。

当应用程序使用(例如)FileInputStream(File)构造函数打开文件时,相对路径名将相对于“当前目录”进行解析,该过程在javadoc中针对的描述如下File.getAbsolutePath()

[…]否则,该路径名以系统相关的方式解析。在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时,它将具有指定的工作目录作为其当前目录。



 类似资料:
  • 当我通过Eclipse运行Gradle项目时,我得到以下错误。 系统找不到系统Java编译器。 确保您已经安装了JDK(不仅仅是JRE)并将JAVA_HOME系统变量配置为指向相应的目录。 无法使用Gradle安装“C:\Gradle-1.2-all\Gradle-1.2”执行生成。 但是我已经安装了JDK 1.7并设置了环境变量。

  • 我刚刚下载了Eclipse并尝试运行它,它给了我这个错误消息: 错误:打开注册表项'Software\JavaSoft\Java运行时环境 到我得到: java版本“1.8.0_231” Java(TM)SE运行时环境(构建1.8.0_231-B11) Java HotSpot(TM)64位服务器VM(构建13.0.1+9,混合模式,共享) 我使用的是Windows 10 Pro EclipseI

  • 当我从项目文件夹运行时,我得到: java也一样: 我在Android Studio安装了JDK,似乎它安装在 设置< code > export JAVA _ HOME =/Users/Mr cloud/Library/Android/SDK/sources/Android-28/或< code > export JAVA _ HOME =/Users/Mr cloud/Library/Andr

  • 我必须将一个文件从一个位置移动到另一个位置,然后运行名为“Irel_Wrapper”的脚本 在putty中,我使用了/home/location mv filename。 所以在Java我使用通道(Exec),我能够执行上述场景,即移动文件作为mv命令是一个puty命令。 但是我不能运行脚本Irel_Wrapper(我的猜测是,因为它不是一个油灰本地命令,我不能在java与通道(Exec)。 我基

  • 我正在通过jenkins运行robot framework,但当我运行构建时,我会得到firefox错误 由用户匿名构建在工作区/var/lib/jenkins/jobs/rocko/workspace中启动 git rev-parse--is-inside-work-tree#timeout=10从远程git存储库获取更改git config remote.origin.url https://

  • 我做错了什么? 作为命令运行docker run-d-name rabbit MQ _ awr-p 5672:5672-p 5673:5673-p 15672:15672 rabbit MQ:3-管理 但http://localhost:15672/没有在浏览器中启动 下面日志