在Eclipse中调试Java时如何使getResourceAsStream工作?

时间:2009-04-17 15:02:00

标签: java eclipse resources

这是令人难以置信的......当我在包含文本文件的打包JAR文件上运行Java时,我可以使getResource()和getResourceAsStream()正常工作。 (供参考,请参阅accessing resources上的Sun文档)当我在Eclipse中运行它时,我似乎无法使相同的程序正常工作,即使我已将我的文本文件放在与编译器相同的树中.class文件

您是否可以指出我的任何细微之处,以确保getResource()和getResourceAsStream()函数正常工作?

我有预感它与CLASSPATH和/或Eclipse将.class文件自动编译。 (我注意到当我运行Ant时,它会编译自上次Ant构建以来已经更改的所有Java文件,即使Eclipse已经编译了这些Java文件。)

6 个答案:

答案 0 :(得分:16)

一些注意事项:

首先 - 正如Chocos所说,把它放在日食源dirs中,而不是二进制dirs中。当您“清理”时,Eclipse将清除二进制目录,以及清理不匹配的文件。它会将非java源文件复制到二进制目录。

这意味着即使您将文件放在二进制目录中,也可能会被eclipse删除...

请记住,getResourceAsStream和getResource相对于调用它们的代码包进行操作。例如:

package a.b.c;
public class Foo {
   ...
   getClass().getClassLoader().getResourceAsStream("fee.txt");
   ...
}

这实际上是寻找a / b / c / fee.txt;包装是预先填写的。如果您在与Foo.java文件相同的源目录中具有fee.txt,或者如果在具有相同目录结构的类路径上有一组单独的资源目录,则此方法很有效。

如果您使用

...getResourceAsStream("/fee.txt");

它将直接在类路径上查找fee.txt。

从命令行运行时,JAR中的哪个位置是资源文件? - 斯科特

答案 1 :(得分:10)

如果您将文本文件与源文件一起放入,Eclipse会将其复制到放置其编译的.class文件的位置,因此当您从Eclipse运行应用程序时,您将看到您的文本文件(并且您将成为能够在Eclipse中编辑文件。)

答案 2 :(得分:2)

发现问题!

确实在源树中包含了我的图片文件。 (在我的Ant构建中,我将它们复制到构建目录)

问题是我最近没有在Eclipse中刷新源代码树。所以这些文件都存在,但是Eclipse没有注意它们。

感谢您让我了解Eclipse应该在我的源代码树中拥有它们。

答案 3 :(得分:1)

  

我有预感它与CLASSPATH和/或Eclipse将.class文件自动编译。

在“运行配置”中,您要启动应用程序,请转到“类路径”选项卡,然后添加用于访问该文件的路径的根文件夹。

因此,例如,如果您尝试加载“blah / file.txt”并且文件位于“folder / blah / file.txt”中,请将“folder”添加到类路径中。如果您尝试仅使用“file.txt”加载资源,则添加“folder / blah”。

答案 4 :(得分:1)

我在IntelliJ中遇到了同样的问题,解决方法是,在项目设置中,添加包含资源文件的文件夹,在我的案例中是声音文件,作为源。在Settings->编译器资源模式中添加?*。wav(或您的pref文件类型)。

答案 5 :(得分:0)

“正常工作”究竟是什么意思?什么是错误/行为?

我建议使用getResource查找您的.class个文件的网址(或大致相当于getClass().getProtectionDomain().getCodeSource()。您可能会发现它指向某处意外。