Java - 正在读取的文件返回null

时间:2014-08-03 17:40:14

标签: java arrays bufferedreader

您好我正在将一个文件加载到我的程序中并分配每个值(存储在一个新行上的数组)我似乎无法发现为什么持有文件内容的数组在每个索引中为空。

    private void readAndProcessWords() {
    try {
        FileReader _fr = new FileReader(FILEPATH);
        BufferedReader textReader = new BufferedReader(_fr);

        int numLines = getNumLines(textReader);
        String[] words = new String[numLines];

        for(int i=0;i<numLines;i++){
            words[i] = textReader.readLine();
            System.out.println(words[i]);
        }
        //clears memory reserved for this buffered reader
        textReader.close();

    } catch(IOException e) {
        System.out.println(e);
    }
}

private int getNumLines(BufferedReader textReader) throws IOException{
    String line;
    int numLines =0;

    while((line = textReader.readLine()) != null){
        numLines++;
    }
    return numLines;    
}
}

解决方案:在循环上方添加以下代码以“重置”文件阅读器

_fr = new FileReader(FILEPATH);
        textReader = new BufferedReader(_fr);

3 个答案:

答案 0 :(得分:4)

最简单的解决方案是重新创建Reader,问题是调用getNumLines()会将BufferedReader中的位置移动到文件末尾。

BufferedReader textReader = new BufferedReader(_fr);
int numLines = getNumLines(textReader); // <-- textReader is at EOF after this.
textReader.close();
textReader = new BufferedReader(_fr);

答案 1 :(得分:1)

而不是读取文件两次来获取行数(这很慢,很烦人,如果文件在两次调用之间发生变化就无法工作),请将行读入可变大小列表:

private void readAndProcessWords() {
    try {
        FileReader _fr = new FileReader(FILEPATH);
        BufferedReader textReader = new BufferedReader(_fr);

        List<String> words = new ArrayList<>();
        String line;
        while ((line = textReader.readLine()) != null) {
            words.add(line);
        }
        textReader.close();

        for (String word : words) {
            System.out.println(word);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

好消息:此功能already exists,因此您无需重写它。

private void readAndProcessWords() {
    try {
        List<String> words = Files.readAllLines(Paths.get(FILEPATH));

        for (String word : words) {
            System.out.println(word);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

答案 2 :(得分:0)

由于缓冲的阅读器是一个对象,因此您将其作为对getNumLines()的引用而不是作为副本传递,因此当您.readLine()发送到同一缓冲的阅读器时,最终会得到一个空值getNumLines(),因为您已将.readLine()运行到其限制。

运行getNumLines()关闭后,使用新的缓冲读卡器重新打开文档。

我还记得在java中有一个Mark()Recall()方法用于缓冲读者,也可以作为解决方法。

我想是的。

        FileReader _fr = new FileReader(FILEPATH);
        BufferedReader textReader = new BufferedReader(_fr);


        textReader.Mark();


        int numLines = getNumLines(textReader);


        textReader.Recall();


        String[] words = new String[numLines];

        for(int i=0;i<numLines;i++)
        {
            words[i] = textReader.readLine();
            System.out.println(words[i]);
        }
        //clears memory reserved for this buffered reader
        textReader.close();