试图使用getResourceAsStream()并失败

时间:2015-06-22 13:28:53

标签: java classloader inputstream

我正在尝试替换使用Files和FileReaders的所有实例,并将它们替换为InputStreams和适当的读取器以准备将应用程序打包在jar中 - 但是,当我尝试使用ClassLoader.getSystemClassLoader().getResourceAsStream()时使用相同的路径时File方法设法找到,由于找不到文件而失败。

我使用和输出的代码:

文件中的文字:

e:Easy
definitions/easy_level_definitions.txt
h:Hard
definitions/hard_level_definitions.txt
d:Derp
definitions/derp_level_definitions.txt

代码:

    String line;
    File f = new File("src/resources/level_sets.txt");
    BufferedReader reader1 = null;
    try {
        reader1 = new BufferedReader(new FileReader(f));
        while ((line = reader1.readLine()) != null) {
            System.out.println(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (reader1 != null) {
                reader1.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    line = null;
    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("src/resources/level_sets.txt");
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    try {
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

输出:

e:Easy
definitions/easy_level_definitions.txt
h:Hard
definitions/hard_level_definitions.txt
d:Derp
definitions/derp_level_definitions.txt
Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Unknown Source)
    at java.io.InputStreamReader.<init>(Unknown Source)
    at Testing.main(Testing.java:34)

3 个答案:

答案 0 :(得分:3)

&#34; src&#34;文件夹仅在IDE中可用。应用程序打包后,它将不再存在,资源将在类路径的根目录下可用。使用此:

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("/level_sets.txt");

答案 1 :(得分:2)

这很难知道,因为看起来你并没有使用标准的Maven风格的目录,而且你的类路径是什么并不完全明显,但看起来你应该使用{{1}或者/level_sets.txt,而不是/src/level_sets.txt。参数是在类路径中给出资源的位置,src/resources/level_sets.txt目录似乎不太可能是类路径的一部分,并且不清楚是否src

前导斜杠表示直接查看类路径的根目录。

作为构建过程的一部分,通常将文件从src目录复制到目标目录(可以命名为resourcesbin)。您的代码需要相对于目标目录而不是classes

答案 2 :(得分:1)

 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("src/resources/level_sets.txt");

您的路径以“src /”开头。尝试将其替换为二进制文件夹(bin或类)。