我的方法readFromFiles找不到源文件

时间:2018-02-14 10:22:38

标签: java nullpointerexception inputstream

我有一个像这样的方法readFromFile:

private static ArrayList<ArrayList<Integer>> readFromFile(String name) {
ArrayList<ArrayList<Integer>> inputs = new ArrayList<ArrayList<Integer>>();

try {
    InputStream in = ReadWriteFile.class.getClass().getResourceAsStream(name);
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line;

    while ((line = reader.readLine()) != null) {
        ArrayList<Integer> input = new ArrayList<Integer>();

        for (int i=0; i<line.length(); i++) {
            int value = 0;
            try {
                value = Integer.parseInt(String.valueOf(line.charAt(i)));
            } catch (Exception e) {
                input.add(value);
            }
        inputs.add(input);
        }
    reader.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}
return inputs;
}

我在这里用这个方法来读取txt文件的文件夹。我需要它将文件的名称放在arraylist中(文件是字母表):

public static ArrayList<TrainingSet> readTrainingSets() {
ArrayList<TrainingSet> trainingSets = new ArrayList<TrainingSet>();

for (int i=0; i<26; i++) {
    char letterValue = (char) (i+26);
    String letter = String.valueOf(letterValue);

    for (ArrayList<Integer> list : readFromFile("C:\\Users\\hp\\Desktop\\resources\\" + letter + ".txt")) {
        trainingSets.add(new TrainingSet(list, GoodOutputs.getInstance().getGoodOutput(letter)));
    }
}
return trainingSets;
}

源文件夹包含以下文件:A.txt,B.txt等。当我尝试运行代码时出现错误。

Exception in thread "main" java.lang.NullPointerException
at java.io.Reader.<init>(Unknown Source)
at java.io.InputStreamReader.<init>(Unknown Source)
at data.ReadWriteFile.readFromFile(ReadWriteFile.java:34)
at data.ReadWriteFile.readTrainingSets(ReadWriteFile.java:22)
at network.Train.<init>(Train.java:16)
at gui.MainGui.<init>(MainGui.java:38)
at gui.MainGui.main(MainGui.java:32)

我猜这个方法找不到我电脑上的文件。但我不知道为什么。表格错了吗?你能救我吗?

2 个答案:

答案 0 :(得分:2)

您正在将绝对文件路径传递给Class.getResourceAsStream(...),这是错误的。

选项1:使用Class.getResourceAsStream(...)但使用相对于类路径上的文件夹(或jar)的路径。例如,如果C:\\Users\\hp\\Desktop\\resources是类路径上的文件夹,则可以执行

ReadWriteFile.class.getResourceAsStream("/" + letter + ".txt");

选项2:使用FileInputStream从完整文件路径中读取

new FileInputStream("C:\\Users\\hp\\Desktop\\resources\\" + letter + ".txt")

答案 1 :(得分:0)

Class.getResourceAsStream用于类路径上的(只读) resources ,可能压缩在jar中。

替换

try {
    InputStream in = ReadWriteFile.class.getClass().getResourceAsStream(name);
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    ...
    reader close();
}

通过

try (BufferedReader = Files.newBufferedReader(Paths.get(name), Charset.getDefaultCharset())) {
    ...
}

Files提供了很好的方法,比如获取所有行。