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

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

你们其中一个人可以指出我的任何细微之处,以确保getResource()和getResourceAsStream()函数正常工作吗?

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

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

几点说明:

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

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

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

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

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

如果你使用

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

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

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

发现问题了!

确实在源代码树中有我的图像文件。 (在我的Ant构建中,我将它们复制到构建目录)

问题是我最近没有在Eclipse中刷新源代码树。 所以文件在那里,但Eclipse没有关注它们。

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

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

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

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

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

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

我建议使用getResource来查找你的.class文件的URL(或者大致相当于getClass().getProtectionDomain().getCodeSource() 。你可能会发现它指向某个意外的地方。