我有点卡在我正在处理的项目中,我想从另一个文件夹中加载文本文件。我正在使用Netbeans,并且出于这个问题的目的,有两个文件夹,一个是我的班级,另一个是资源。
该课程位于../misc/[ClassName]
,我要加载的文字文件位于../resources/[Name].txt
这听起来简单得令人难以置信,并且已经完成了Java很长一段时间我真的应该知道这一点,我假设加载此文件而不是仅使用FileReader的最佳方法是使用getResourceAsStream
,如图所示:
InputStream is =
this.getClass().getClassLoader().getResourceAsStream(_filename + ".txt");
理想情况下节省时间而不必在文件路径中进行硬编码。现在,我的问题是我不断从上面的代码返回null,实际上我可以放在它上面的任何其他排列。我已尝试/resource/filename.txt
或resource/filename.txt
作为参数,使用.getClass().getResourceAsStream
而不是getClassLoader()
,所有内容仍然会返回相同的结果。
为了避免任何混淆,我已经检查了文件名及其绝对正确和正确的情况等,所以这不是问题。有任何想法吗?我知道我可以使用FileReader
来实现相同的目标,但现在它是一种原则!
答案 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")
。