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

Java BufferedReader返回null,即使文件中有文本,java,bufferedreader,java-io,bufferedwriter,Java,Bufferedreader,Java Io,Bufferedwriter,因此,即使我的文件points.txt中已经有一些虚构的玩家,它仍然会在第一个if语句中返回true,所以新玩家会打印到文件中。但问题是,当我试着用一段时间的句子来阅读文件时,它甚至都没有读过。我已经检查过System.out.println,发现它返回null。即使我看到它填充了新数据,它怎么能返回null呢? 我做错了什么?我已经为这个问题挣扎了大约一个半小时,尝试了我所知道的一切。 非常感谢您的帮助。此代码 BufferedReader rea = new BufferedReader(n

因此,即使我的文件points.txt中已经有一些虚构的玩家,它仍然会在第一个if语句中返回true,所以新玩家会打印到文件中。但问题是,当我试着用一段时间的句子来阅读文件时,它甚至都没有读过。我已经检查过System.out.println,发现它返回null。即使我看到它填充了新数据,它怎么能返回null呢? 我做错了什么?我已经为这个问题挣扎了大约一个半小时,尝试了我所知道的一切。 非常感谢您的帮助。

此代码

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);
}
覆盖原始文件

使用

要附加此代码,请执行以下操作

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);
}
覆盖原始文件

使用

使用新的BufferedWriternew FileWriterpoints.txt追加

;您正在覆盖文件以前的内容。若要在现有文件的末尾添加新内容,则需要使用带有布尔追加参数的构造函数,如

BufferedWriter writ = new BufferedWriter(new FileWriter("points.txt"),true);
另外,不要忘记刷新/关闭读写器。

使用新的BufferedWriternew FileWriterpoints.txt;您正在覆盖文件以前的内容。若要在现有文件的末尾添加新内容,则需要使用带有布尔追加参数的构造函数,如

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

另外,不要忘记刷新/关闭读写器。

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

当使用缓冲读写器时,无法保证实际读写何时完成

也就是说,一种修复方法是在到达文件末尾之前在读卡器上设置一个标记,并关闭或至少刷新输出流。这将强制BufferedWriter将内容实际写入文件系统,并允许读取器读取新内容

注意:您可能会发现,在某些文件系统上,这种方法不起作用

new BufferedWriter(new FileWriter("points.txt"),true);
尽管如此,我认为更好的方法是在尝试读取文件之前检查文件的长度和存在性。请看下面的样品

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();
}
流创建已放在try块中,以便安全地清理它们


我希望这能有所帮助。

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

当使用缓冲读写器时,无法保证实际读写何时完成

也就是说,一种修复方法是在到达文件末尾之前在读卡器上设置一个标记,并关闭或至少刷新输出流。这将强制BufferedWriter将内容实际写入文件系统,并允许读取器读取新内容

注意:您可能会发现,在某些文件系统上,这种方法不起作用

new BufferedWriter(new FileWriter("points.txt"),true);
尽管如此,我认为更好的方法是在尝试读取文件之前检查文件的长度和存在性。请看下面的样品

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();
}
流创建已放在try块中,以便安全地清理它们


我希望这会有所帮助。

在第一个循环中,您必须刷新写入程序。这是一个建议,使用List top=new ArrayList;而不是ArrayList top=新的ArrayList@如果ashokramcse使用的是Java7或更高版本,他也会使用钻石推理!在第一个循环中,您必须刷新writer这是一个建议,即使用List top=new ArrayList;而不是ArrayList top=新的ArrayList@如果ashokramcse使用的是Java7或更高版本,他也会使用钻石推理!他问的是为什么即使他只是在上面写,它也没有读,答案是他没有因为指向这个而刷新/关闭writer+1!他问的是为什么即使他只是在上面写,它也没有读,答案是他没有因为指向这个而刷新/关闭writer+1!