在Java中使用Class.getResourceAsStream()的问题

时间:2010-02-18 12:26:21

标签: java

我有点卡在我正在处理的项目中,我想从另一个文件夹中加载文本文件。我正在使用Netbeans,并且出于这个问题的目的,有两个文件夹,一个是我的班级,另一个是资源。

该课程位于../misc/[ClassName],我要加载的文字文件位于../resources/[Name].txt

这听起来简单得令人难以置信,并且已经完成了Java很长一段时间我真的应该知道这一点,我假设加载此文件而不是仅使用FileReader的最佳方法是使用getResourceAsStream,如图所示:

InputStream is = 
        this.getClass().getClassLoader().getResourceAsStream(_filename + ".txt");

理想情况下节省时间而不必在文件路径中进行硬编码。现在,我的问题是我不断从上面的代码返回null,实际上我可以放在它上面的任何其他排列。我已尝试/resource/filename.txtresource/filename.txt作为参数,使用.getClass().getResourceAsStream而不是getClassLoader(),所有内容仍然会返回相同的结果。

为了避免任何混淆,我已经检查了文件名及其绝对正确和正确的情况等,所以这不是问题。有任何想法吗?我知道我可以使用FileReader来实现相同的目标,但现在它是一种原则!

4 个答案:

答案 0 :(得分:13)

该类显然由不同的类加载器加载,该类加载器根本不知道该资源。而是使用从当前ClassLoader获得的上下文Thread。它知道一切。

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(_filename + ".txt");

答案 1 :(得分:7)

我使用IntelliJ并且发现了一个常见的“问题”,我忘记定义适当的资源模式以包含.txt文件,.css文件等。这意味着当构建过程运行时,它将从中排除这些文件它创建的jar文件,导致调用getResource()返回null。

我怀疑你的Netbeans环境可能会发生类似的事情,所以可能值得一试。

答案 2 :(得分:5)

我遇到了与David Meadows相同的问题,因为它自2008年开始运作并没有问题。在此处阅读有关getResourceAsStream( )的所有帖子。我的问题是我可以从jar文件中读取一些文件。可以读取所有 png 文件,但不能读取wav文件。奇怪的是,如果我将.wav文件重命名为.png。这些文件可以加载和播放!

当我部署它运行的应用程序时,它能以某种方式成为IntelliJ吗?

注意:我知道.wav文件可以通过JarFile和JarEntry来实现。

intelliJ中的解决方案:在项目设置中,将包含资源文件的文件夹(在我的案例中为声音文件)添加为源文件夹。添加

  

?*。wav(或您的pref文件类型)

在“设置” - >“编译器资源模式”中。

答案 3 :(得分:4)

你的classpath从哪里开始?它是从misc还是..开始的?

您可以发布this.getClass().getName()的价值吗?

如果它返回misc.ClassName,您必须使用this.getClass().getResourceAsStream("/resources/filename.txt")