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

在Eclipse中调试Java时,如何使getResourceAsStream工作?,java,eclipse,resources,Java,Eclipse,Resources,这是令人难以置信的。。。当我在包含文本文件的打包JAR文件上运行Java时,我可以使getResource()和getResourceAsStream()正常工作。(参考请参见上的Sun文档)在Eclipse中运行同一程序时,我似乎无法使其正常工作,即使我已将文本文件与编译的.class文件放在同一棵树中 你们中有人能告诉我一些细节来确保getResource()和getResourceAsStream()函数正常工作吗 我有一种预感,它与类路径和/或Eclipse将自动编译的.class文件放

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

你们中有人能告诉我一些细节来确保getResource()和getResourceAsStream()函数正常工作吗


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

如果将文本文件与源文件放在一起,Eclipse会将其复制到放置编译的.class文件的任何位置,因此,当您从Eclipse运行应用程序时,您将看到您的文本文件(并且您还可以从Eclipse中编辑该文件)

我有一种预感,它与类路径和/或Eclipse将自动编译的.class文件放在哪里有关

在启动应用程序的运行配置中,转到Classpath选项卡并添加用于访问文件的路径的根文件夹


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

您所说的“正常工作”到底是什么意思?错误/行为是什么

我建议使用
getResource
查找您的
.class
文件之一的URL(或者大致相当于
getClass().getProtectionDomain().getCodeSource()
。您可能会发现它指向了意想不到的地方。

注意:

首先——正如Chocos所说,将其放在eclipse源目录中,而不是二进制目录中。eclipse将在“清理”时清除二进制目录,并清理不匹配的文件。它将非java源文件复制到二进制目录中

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

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

package a.b.c;
public class Foo {
   ...
   getClass().getClassLoader().getResourceAsStream("fee.txt");
   ...
}
实际上,这将查找a/b/c/fee.txt;包是预先挂起的。如果fee.txt与Foo.java文件位于同一个源目录中,或者如果类路径上有一组单独的资源目录,并且具有相同的目录结构,那么这一点非常有效

如果你使用

...getResourceAsStream("/fee.txt");
它将直接在类路径上查找fee.txt

从命令行运行时,JAR中的资源文件在哪里?
--斯科特发现了问题!

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

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


感谢您告诉我Eclipse应该在我的源代码树中包含这些文件。

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

如果您进入窗口->首选项->常规->工作区,请选中“自动刷新”框,这将防止将来出现此问题。否则,请确保通过eclipse向项目添加内容(您可以通过文件->导入,在某些平台上,只需将项目拖放到项目中即可)还要确保Eclipse知道这些文件:如果它们是在Eclipse之外添加的,请“刷新”源代码树(正如Jason S在另一个答案中所指出的)。请参考eugener的答案