在什么情况下文件放在JAR的资源中,但是在类'ClassLoader中无法访问?

时间:2017-08-18 14:44:07

标签: java groovy

我只是想使用this.class.getResourceAsStream(filename)在一个简单的.txt文件中读入我的java项目。我在main / resources中有几个文件,当我尝试将它们作为输入流时,几乎所有文件都返回一个对象。我无法读到的唯一对象是我的文本文件。

我已经将文件放在了类加载器可读的所有其他资源文件中,但看起来这个文件由于某种原因没有放在类的classLoader中。如果我解压缩jar,该文件仍然包含在与所有其他资源相同的目录中,因此它似乎正在构建正确。

我想我要问的是,我在什么时候告诉Java我希望将哪些文件作为资源包含在类ClassLoader中?如果事情在正确的地方(即主要/资源),那么在建造罐子时应该做些什么呢?

这是代码的样子,它是各自的返回值,当运行它可以找到的文件和它不能的文件时,它们都位于同一个地方。

// This is not found. Both are placed at src/main/resources
def tmpDict = this.class.getResourceAsStream("dict.txt")

println tmpDict // null

// This is found
def tmpDict2 = this.class.getResourceAsStream("calc.config")

println tmpDict2 // sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@2dae5a79

2 个答案:

答案 0 :(得分:0)

如果没有更多信息,我会说道路错了。当我只使用“file.txt”获取NPE的路径时

used this method从流中读取。该文件位于\src\main\resources\static\file.txt 这在eclipse中工作,打包到jar中并在那里工作。

public String getFile() throws Exception {
    InputStream in = Controller.class.getClassLoader().getResourceAsStream("static/file.txt");
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset.defaultCharset()));
    StringBuilder out = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        out.append(line);
    }        
    return out.toString();
}

答案 1 :(得分:0)

一些非常基本的检查:

文件必须区分大小写(因为它不是Windows文件),文件名的特殊字符可能很麻烦。还要检查项目中的文件是否有两次文件扩展名(.txt.txt - Windows隐藏扩展名)。

检查getResourceAsStream("/a/b/c/A.txt")是否确实为空。

如果不是,则编码可能会出错。