尝试使用 getResourceAsStream() 并失败
Trying to use getResourceAsStream() and failing
我正在尝试替换所有使用 Files 和 FileReaders 的实例,并将它们替换为 InputStreams 和适当的读取器,以准备将应用程序打包到 jar 中 - 但是,当我尝试使用 ClassLoader.getSystemClassLoader().getResourceAsStream()
时文件方法设法找到的路径,由于找不到文件而失败。
我使用并输出的代码:
文件中的文本:
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)
这很难知道,因为看起来您没有使用标准的 Maven 样式目录,而且您的类路径是什么也不完全清楚,但看起来您应该使用 /level_sets.txt
或 /src/level_sets.txt
,而不是 src/resources/level_sets.txt
。该参数给出了资源在类路径中的位置,src
目录似乎不太可能成为类路径的一部分,并且不清楚 resources
是否会。
前导斜杠表示直接查看类路径的根目录下。
作为构建过程的一部分,通常会将文件从 src 目录复制到目标目录(可以命名为 bin
或 classes
)。您的代码需要相对于目标目录查找,而不是在 src
.
下
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("src/resources/level_sets.txt");
您的路径以 "src/" 开头。尝试将其替换为二进制文件夹(bin 或 类)。
"src" 文件夹仅在您的 IDE 中可用。一旦应用程序被打包,它就不再存在,资源将在类路径的根目录下可用。使用这个:
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("/level_sets.txt");
我正在尝试替换所有使用 Files 和 FileReaders 的实例,并将它们替换为 InputStreams 和适当的读取器,以准备将应用程序打包到 jar 中 - 但是,当我尝试使用 ClassLoader.getSystemClassLoader().getResourceAsStream()
时文件方法设法找到的路径,由于找不到文件而失败。
我使用并输出的代码:
文件中的文本:
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)
这很难知道,因为看起来您没有使用标准的 Maven 样式目录,而且您的类路径是什么也不完全清楚,但看起来您应该使用 /level_sets.txt
或 /src/level_sets.txt
,而不是 src/resources/level_sets.txt
。该参数给出了资源在类路径中的位置,src
目录似乎不太可能成为类路径的一部分,并且不清楚 resources
是否会。
前导斜杠表示直接查看类路径的根目录下。
作为构建过程的一部分,通常会将文件从 src 目录复制到目标目录(可以命名为 bin
或 classes
)。您的代码需要相对于目标目录查找,而不是在 src
.
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("src/resources/level_sets.txt");
您的路径以 "src/" 开头。尝试将其替换为二进制文件夹(bin 或 类)。
"src" 文件夹仅在您的 IDE 中可用。一旦应用程序被打包,它就不再存在,资源将在类路径的根目录下可用。使用这个:
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("/level_sets.txt");