【发布时间】:2015-06-07 10:52:24
【问题描述】:
我使用 java 的时间不长,所以我不确定还要寻找什么。我希望有人能指出我正确的方向。
目标: 我想使用一个查找表,存储为文本文件。但我不想使用绝对路径,因为最后我想打包一个版本并能够从任何位置调用它(文本文件将包含在打包版本中)。
当前设置: 我将文本文件放在一个名为“resources”的文件夹中(因为通过阅读有关 java 的教程,我得到了一个印象,我应该把它放在这个位置以维护一个更好的结构化项目)。
在根包文件夹中,我有一个类 (MainClass.java),它调用子包中的另一个类 (LookUpClass.java)。 文件夹设置如下:
- 源
- Java
- main.package.com
- 分包
- LookUpClass.java
- PlotterClass.java
- MainClass.java
- 分包
- main.package.com
- 资源
- 查找表
- LookUpTable1.txt
- LookUpTable2.txt
- 查找表
- Java
我在LookUpClass.java 中编写了一个方法,该方法从我的资源查找表中检索某一行。为了检索文件并读出某一行,我使用了
// Gets respective line from LUT
private static String getLineFromLUT(int line) {
URL url = LookUpClass.class.getClass().getResource("/LookUpTables/LookUpTable1.txt");
File file = new File(url.toURI());
BufferedReader br = new BufferedReader(new FileReader(file));
for (int i = 0; i < line; ++i)
br.readLine();
return br.readLine;
}
在我的项目结构中,“java”文件夹被标记为“source”,而“resources”被标记为“resources”。
我的测试设置非常简单:
public static void main(String[] args) throws URISyntaxException, IOException {
String c = LookUpClass.getLineFromLUT(5);
System.out.println("Color of line 5: " + c);
}
输出:
Color of line 5: 0 0 38
(这是正确的。)
我在PlotterClass.java 中添加了完全相同的行,它也可以正常工作。
问题:
现在,如果我在 MainClass.java 中尝试相同的操作,我会收到 url 为空的错误。似乎找不到资源/资源文件夹。
我已经阅读了关于 SO 的各种帖子,并尝试了几个建议的解决方案,但到目前为止都失败了:
- 如果使用
LookUpClass.class.getClassLoader().getResource("/LookUpTables/LookUpTable1.txt")来自MainClass.java和LookUpClass.java的调用都失败(url为空)。 - 我尝试使用以下路径(在任何一个类中都不起作用): “LookUpTables/LookUpTable1.txt”(删除起始“/”) “/subpackage/LookUpTables/LookUpTable1.txt” "../subpackage/LookUpTables/LookUpTable1.txt"
- 由于使用了 Idea IntelliJ,我检查了“设置 > 构建、执行、部署 > 编译器 > 资源模式”并将“*.txt”添加到模式中。没有任何改变。
- 如果添加
Class c = LookUpClass.class.getClass();,在Debug模式下c是“class.java.lang.Class”。我期待像“main.package.com.subpackage.LookUpClass”这样的东西。 - 在某些时候我尝试使用
getResourceAsStream(),但我不明白如何获得我的(例如)第 5 行,所以我放弃了它。如果它解决了我的问题,我愿意阅读此内容。
我不知道如何解决这个问题。我意识到在这一点上我只是在尝试一些东西,甚至不明白为什么它可以或不能工作。
对我来说,似乎LookUpClass.java 的运行位置与MainClass.java 不同。但是“资源”文件夹和相应的文本文件位置永远不会改变。如何在一种情况下找到文件,而在另一种情况下找不到文件?
【问题讨论】:
-
另外三个问题:您使用的是 IDE(如 Eclipse)吗?您是否使用任何构建工具(如 Maven)?您的文本文件是打算由用户更新还是分发的一部分?
-
您能否尝试确保您用于获取类加载器的类对象实际上是由
try { Class.forName(MainClass.class.getName()); } catch (final ClassNotFoundException ex) { }加载的? -
@Seelenvirtuose 两者都是:我正在使用 IntelliJ,并且该项目确实是使用 Maven 构建的。文本文件是静态的并且是分发的一部分。它们包含热图的 RGB 代码。
-
@muued 我将此代码添加到
getLineFromLUT的开头,执行时没有任何反应。所以我猜 MainClass 确实找到了。执行MainClass.java和LookUpClass.java。 -
由于文件位于资源目录中,我建议使用
URL url = LookUpClass.class.getClass().getResource("resources/LookUpTables/LookUpTable1.txt");,只要项目不作为 jar 运行,我就可以使用它。
标签: java packages getresource directory-structure