Java:while((line = bufferedReader.readLine())!= null) 缺失2行

3
忽略传递到方法中的参数。 我的代码:
    public static void setEnabled(EntityPlayer p, Boolean b){
    try{
        FileReader fileReader = new FileReader(SLInfo.STORAGEFILE);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        FileWriter fileWriter = new FileWriter(SLInfo.STORAGEFILE);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        String line = null;
        boolean breakearly = false;
        bufferedWriter.write("HeLlo");
        bufferedWriter.newLine();
        bufferedWriter.write("World!");

        System.out.println("GOT TO THIS FRICKIN POINT");

        while((line = bufferedReader.readLine()) != null){
            System.out.println(line);
            Thread.sleep(2000);
        }
        bufferedReader.close();
        bufferedWriter.close();
    }catch(Exception e){e.printStackTrace();}
}

这只是简单地输出了“到达此处该死的点”(我在愤怒中决定了这个字符串)。我不知道为什么会这样。在我的文件中,它显示为:

"Hello"
"World"

我就是不明白。编辑:太棒了,我不知道那个。不幸的是,那只是一个我认为可以解决我的问题的简单例子……它没有。看看下面的代码,并假设文件包含p.username,在第1行上,为什么“到这里了”从未被打印出来,而“做了这个”总是被打印出来。我期望它的作用是:如果p.username在第x行,它将更改第x行以读取“p.username booleanvalue”,如果p.username不在文件中任何位置,“p.username booleanvalue”将附加到文件的最后一行。
    public static void setEnabled(EntityPlayer p, Boolean b){
    try{
        FileReader fileReader = new FileReader(SLInfo.STORAGEFILE);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        FileWriter fileWriter = new FileWriter(SLInfo.STORAGEFILE);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        String line = null;
        boolean breakearly = false;

        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
            if (line.contains(p.username)){
                System.out.println("Got here");
                bufferedWriter.write(p.username + " " + Boolean.toString(b));
                bufferedWriter.newLine();
                bufferedWriter.flush();
                breakearly = true;
                break;
            }
        }
        bufferedWriter.flush();
        System.out.println(breakearly);
        if (!breakearly){
            System.out.println("did this");
            bufferedWriter.write(p.username + " " + Boolean.toString(b));
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
        bufferedReader.close();
        bufferedWriter.close();
    }catch(Exception e){e.printStackTrace();}
}

(是的,我知道我有过多的刷新)

3
阅读前请关闭写作程序。 - tkroman
4个回答

4
这就是 BufferedWriter 中的 Buffered 的作用。
你写了两行文本,由于缓冲,它们被存储在内存中。
然后你从文件中读取,但此时文件中还没有任何内容。
接着你关闭了写入器,导致缓冲区刷新并将其内容添加到文件中。
如果想在读取之前强制刷新缓冲区,可以使用 bufferedWriter.flush() 或者关闭写入器。

0

你没有刷新输出:

尝试这段代码 boolean breakearly = false; bufferedWriter.write("HeLlo"); bufferedWriter.newLine(); bufferedWriter.write("World!");

    // flush
    bufferedWriter.flush();

    // close the bufferwriter
    bufferedWriter.close();

现在再次读取您的文件

    while((line = bufferedReader.readLine()) != null){
        System.out.println(line);
        Thread.sleep(2000);
    }

完全没有必要同时调用 flush()close()。在 Javadoc 中明确指出,调用 close() 就会刷新。 - Brian Roach
然后回答问题的答案 - user3215442
为什么?我只是给更正确的答案点了个赞,并提供了对你的改进,这也会被未来阅读你的回答的任何其他人看到。我应该只是给你的回答点个踩,而不是这样做吗?专业提示:当有人指出你代码中的错误或可以改进的地方时,不要感到冒犯。 - Brian Roach

-1
当你写入文件时,实际上是写入文件缓存,尝试调用bufferedWriter.close()保存所有更改。

2
这是正确的(有点 - 它正在写入缓冲区),但可以通过解释“为什么”并提到flush()来改进。 - Brian Roach

-1

写下这些代码:

bufferedWriter.flush();  // flush 

// now close the bufferwriter
bufferedWriter.close();

now read your file again

while((line = bufferedReader.readLine()) != null){
  // your reading code
}

1
完全没有必要同时调用 flush()close()。在 Javadoc 中明确指出,调用 close() 就会刷新。 - Brian Roach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接