我写了一些代码来打开和读取csv文件的内容:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(fileName)));
String line;
try {
line = bufferedReader.readLine();
while (line != null) {
line = bufferedReader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// close buffered reader
}
该代码在单元测试中运行良好,没有引发异常。但是,一旦我尝试通过cmd启动程序,它就会抛出一个来自InputStreamReader的NPE:
Exception in thread "main" java.lang.NullPointerException
at exercise.FileLoader.loader(FileLoader.java:28)
at exercise.Application.main(Application.java:22)
程序实际上将文件名作为参数:
public static void main(String[] args) {
if (args.length > 1) {
System.out.println("Too many input arguments.");
System.exit(-1);
}
String fileName = args[0];
//here runs the method who reads the csv file above
}
你能告诉我发生了什么吗?
答案 0 :(得分:0)
我认为您的问题与通过cmd启动程序后无法找到文件有关。 您是否尝试过将程序放在文件的同一文件夹中?您也可以在主窗口中要求用户输入,以便提供正确的文件夹。
答案 1 :(得分:0)
以下内容在文件系统上读取不是文件,但在类路径上读取资源(原则上是只读的。
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(getClass().getResourceAsStream(fileName)));
此外,编码是当前平台的编码,在另一台PC上可能会有所不同。
而且我没有看到close()
在准备问题时可能被删除。
对于文件系统:
Path path = Paths.get(filename);
try (BufferedReader bufferedReader =
Files.newBufferedReader(path, Charset.defaultCharset())) {
line = ...
...
} // Automatic close.
当路径不是绝对路径时,必须格外小心。然后取决于“工作目录”指向的位置以及应用程序的启动位置。