【问题标题】:Java: while((line = bufferedReader.readLine()) != null) MISSING 2 LINESJava: while((line = bufferedReader.readLine()) != null) 缺少 2 行
【发布时间】:2014-03-07 00:54:54
【问题描述】:

忽略传递给方法的参数。 我的代码:

    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();}
}

这只是简单地输出“GOT TO THIS FRICKIN POINT”(我愤怒地决定了这个字符串)。我不知道为什么。在我的文件中,它显示:

"Hello"
"World"

我只是不明白。

编辑:酷。我不知道。不幸的是,这只是一个简单的例子,我认为它可以解决我的问题......它没有。看看我下面的代码,并假设文件在第 1 行包含 p.username,它是一个字符串,为什么从来没有打印“到这里”而总是打印“这样做”。我期望它做什么:如果 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();}
}

(是的,我知道我有过多的冲洗)

【问题讨论】:

  • 阅读前关闭作者。

标签: java bufferedreader readline


【解决方案1】:

这就是BufferedWriter 中的Buffered 的用武之地。

你写了两行,由于缓冲存储在内存中。

然后您从文件中读取,该文件还没有写入任何内容。

然后关闭写入器,导致缓冲区刷新,将内容添加到文件中。

要在阅读前强制刷新,可以使用bufferedWriter.flush(),或者关闭它。

【讨论】:

    【解决方案2】:

    你没有刷新你的输出:

    试试这个代码 布尔breakearly = false; bufferedWriter.write("你好"); bufferedWriter.newLine(); bufferedWriter.write("世界!");

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

    现在再次读取您的文件

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

    【讨论】:

    • 绝对没有理由打电话给flush() close()。调用close() 刷新;这在 Javadoc 中是明确的。
    • 然后给出问题的答案
    • 为什么?我只是赞成更正确的一个,并对您的提出了改进,将来阅读您的答案的其他人也会阅读。我应该否决你的投票而不是这样做吗?提示:当有人指出错误或可以用您的代码改进时,不要生气。
    【解决方案3】:

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

    【讨论】:

    • 这是正确的(有点 - 它正在写入缓冲区),但可以通过解释 为什么 并提及 flush() 来改进
    【解决方案4】:

    写下这几行:

    bufferedWriter.flush();  // flush 
    
    // now close the bufferwriter
    bufferedWriter.close();
    
    now read your file again
    
    while((line = bufferedReader.readLine()) != null){
      // your reading code
    }
    

    【讨论】:

    • 绝对没有理由打电话给flush() close()。调用close() 刷新;这在 Javadoc 中是明确的。
    猜你喜欢
    • 2021-03-22
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2021-12-31
    • 2012-11-04
    • 2012-07-20
    相关资源
    最近更新 更多