即使文件中有文本,BufferedReader也会返回null

时间:2014-01-22 01:54:06

标签: java bufferedreader java-io bufferedwriter

BufferedReader rea = new BufferedReader(new FileReader("points.txt"));
BufferedWriter writ = new BufferedWriter(new FileWriter("points.txt"));

ArrayList<String> top = new ArrayList<String>();

// checking if file is empty, so it enters imaginary players and scores
// if it is.
if (rea.readLine() == null) {
    for (int i = 1; i < 6; i++) {
        writ.write("Player" + i + "\t\t" + "99:99");
        writ.newLine();
    }
}
while ((readthis = rea.readLine()) != null) {
    top.add(readthis);
}

所以会发生的是,即使我的文件“points.txt”已经有一些内部组成的玩家,它仍然会在第一个句子上返回true,因此新玩家会打印到文件中。但问题是,当我尝试在一段时间内读取文件时,它甚至都没有通过它。我已经检查过System.out.println()并发现它返回null。即使我看到它填写新数据,它怎么能返回null? 我究竟做错了什么?我现在正在努力解决这个问题大约一个半小时,尝试了我所知道的一切。 任何帮助非常感谢。

3 个答案:

答案 0 :(得分:4)

通过使用new BufferedWriter(new FileWriter("points.txt"));,您将覆盖以前的文件内容。如果要在现有文件末尾添加新内容,则需要使用带boolean append参数的构造函数,如

new BufferedWriter(new FileWriter("points.txt"),true);

另外,不要忘记刷新/关闭读者/作者。

答案 1 :(得分:3)

此代码

BufferedWriter writ = new BufferedWriter(new FileWriter("points.txt"));

覆盖原始文件。

使用

BufferedWriter writ = new BufferedWriter(new FileWriter("points.txt"),true);

追加

答案 2 :(得分:0)

请理解使用BufferedReader / Writer同时读取和写入文件并不是一个好主意。

使用缓冲读卡器或写入器时,无法保证何时完成实际的读写操作。

话虽如此,一个解决方法是在到达文件末尾之前在阅读器上设置标记,并关闭(或至少刷新)输出流。这将强制BufferedWriter将内容实际写入文件系统,并允许读者阅读新内容。

注意:您可能会发现在某些文件系统上,此方法无效。

rea.mark(4048); // Set mark at beginning of file    
if (rea.readLine() == null) {
    for (int i = 1; i < 6; i++) {
        writ.write("Player" + i + "\t\t" + "99:99");
        writ.newLine();
    }
    writ.close();
    rea.reset();
}

话虽如此,我认为更好的方法是检查文件之前的长度和存在尝试从中读取。请参阅下面的示例。

File file = new File("points.txt");

// checking if file is empty, so it enters imaginary players and scores
// if it is.'
if ((!file.exists()) || (file.length() == 0)) {
    try (BufferedWriter writ = new BufferedWriter(new FileWriter(file))) {
        for (int i = 1; i < 6; i++) {
            writ.write("Player" + i + "\t\t" + "99:99");
            writ.newLine();
        }
    }
    // writ is closed by the try()
}
try (BufferedReader rea = new BufferedReader(new FileReader(file))) {
    ArrayList<String> top = new ArrayList<String>();

    String readthis;
    while ((readthis = rea.readLine()) != null) {
        top.add(readthis);
    }
}
// rea is safely closed by the try()

将流创建放在try()块中,以便安全地清理它们。

我希望这会有所帮助。