Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java can';在Eclipse中运行时找不到文件_Java_Eclipse_File_Exception_Filereader - Fatal编程技术网

Java can';在Eclipse中运行时找不到文件

Java can';在Eclipse中运行时找不到文件,java,eclipse,file,exception,filereader,Java,Eclipse,File,Exception,Filereader,当我运行一个应该在Eclipse中读取文件的Java应用程序时,我会得到一个Java.io.FileNotFoundException,即使该文件位于正确的目录中。我可以从命令行编译和运行应用程序;这个问题只发生在Eclipse中,有多个项目和应用程序。我是否需要在运行配置或构建路径中更改设置以使其正确查找文件?在Eclipse中创建默认Java应用程序时,您会得到以下目录结构: ./ProjectName/-根目录 ./ProjectName/bin/-输出目录,包含.class文件 ./Pr

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

在Eclipse中创建默认Java应用程序时,您会得到以下目录结构:

./ProjectName/-根目录
./ProjectName/bin/-输出目录,包含.class文件
./ProjectName/src/-source目录,包含.java文件

如果应用程序请求“/data.txt”,它将相对于根目录搜索它。这是“工作目录”,可以按照上面Martin的回复在arguments选项卡中进行配置


你说它是通过命令行工作的?这可能是因为运行java二进制文件时,您位于bin或src文件夹中。本例中的工作目录是命令提示符当前所在的目录。例如,如果您进入/src/目录,比如说
javac*.java
,然后从那里运行文件,它将在/src/目录中搜索“/data.txt”。如果您进入/bin/目录并从那里运行应用程序,它将查找与/bin/目录相关的文件。

您应该不要在
java.io
中使用相对路径。路径将取决于当前工作目录,而当前工作目录取决于启动应用程序的方式,因此在所有环境中,路径本身并不相同。这在Java应用程序内部是无法控制的。便携性问题!始终使用绝对路径。因此,例如UNIX和consorts(或磁盘号不相关时的Windows)的
c:/path/to/file.ext
/path/to/file.ext
(带前导斜杠)

每当您想随应用程序一起发送一些文件时,通常的做法是将它们也放在类路径中。这样,您就可以使用它来获取其位置。它返回一个。您可以使用或并将其传递给的构造函数,然后以通常的方式进一步使用它

在Eclipse项目中,
src
文件夹(Java源代码所在的位置)基本上是类路径的根。此外,它当然也涵盖了项目构建路径中的所有其他项目和(外部)文件夹

假设您已将特定文件放置在类路径的根目录中:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL url = classLoader.getResource("file.ext");
File file = new File(url.getPath());
FileInputStream input = new FileInputStream(file);
// ...
您甚至可以使用直接获取:

如果它被放置在包中,那么您可以只使用通常的路径名:

URL url = classLoader.getResource("com/example/file.ext");
// ...


问题很可能是应用程序使用的是相对路径名。正如@BalusC所说,相对路径名可能会有问题。但在我看来,当他说“你应该永远不要在java.io中使用相对路径”时,他走得太远了

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

[…]否则,将以依赖于系统的方式解析此路径名。在UNIX系统上,通过对当前用户目录解析相对路径名,使其成为绝对路径名。在Microsoft Windows系统上,通过将相对路径名与以路径名命名的驱动器的当前目录(如果有)进行解析,相对路径名将变为绝对路径名;如果不是,则根据当前用户目录解析

因此,我们立即看到“当前目录”的概念在Windows和UNIX平台上有不同的细微差别。第二个问题是,在纯Java中,您无法确定当前目录是什么,并且您肯定无法使用纯Java为当前JVM更改它。(当JVM启动时,“user.dir”系统属性设置为当前目录,但没有任何东西阻止应用程序更改该属性,因此您不能完全依赖它。此外,更改“user.dir”只会更改解析空路径的方式,而不是一般的相对路径。)

那你该怎么办呢

  • 一个选项是使用绝对路径名引用文件。这在(几乎)所有情况下都是可靠的,但是如果用户必须输入路径名,或者 如果需要避免硬连线(或配置)绝对路径名

  • 第二个选项是使用类路径相对路径名,并相对于应用程序的安装目录定位文件。如果这是您需要执行的操作,则此操作有效,但如果您需要将
    文件
    传递给某个库方法,则会出现问题。如果您试图查找用户的应用程序首选项,它也没有帮助。(通常,将用户首选项放入安装目录是一个错误…)

  • 第三种选择是相对于从其他地方获得的某个绝对目录命名文件;e、 新文件(System.getProperty(“home.dir”),“foo/bar”)

  • 最后一个选项是使用相对路径名,并假设用户知道当前目录是什么。对于用户从命令行运行的许多应用程序,这是正确的解决方案


在Eclipse的特定情况下,有一个简单的解决方案。转到用于启动应用程序的“运行配置”,打开“参数”选项卡,然后单击“其他”单选按钮。然后输入一个绝对路径名作为已启动应用程序的工作目录。当启动子JVM时,它将具有指定的工作目录作为其当前目录。

假设用户未输入完整目录
URL url = classLoader.getResource("com/example/file.ext");
// ...
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...
    File testFile = new File("");
    String currentPath = testFile.getAbsolutePath();
    System.out.println("current path is: " + currentPath);