回答在fileoutputstreams中java中的I / O流中刷新的必要性

时间:2013-04-16 11:53:37

标签: java io

嗨我需要一个答案,因为java.since中的I / O流必须刷新,在我的程序中使用flush并且没有flush,输出是相同的。所有内容都写入目标文件。这就是为什么我需要flush?将文件输入流消耗缓冲内存吗?

以下是我的简单示例程序

       file = new File("c:/newfile.txt");
        fop = new FileOutputStream("c:/newfile.txt");

        // if file doesnt exists, then create it
        if (!file.exists()) {
            file.createNewFile();
        }

        // get the content in bytes
        byte[] contentInBytes = content.getBytes();

        fop.write(contentInBytes);
        fop.flush();
        fop.close();

即使我命令刷新并关闭它也可以正确地将内容写入文件..?然后我们需要刷新?并且文件输出会消耗内存吗?

2 个答案:

答案 0 :(得分:1)

在流上关闭调用flush,因此如果要关闭流,则不需要刷新。

如果要确保保存数据,而不关闭流,例如,则刷新很有用。通过Internet发送消息或写入控制台时。您可能会注意到,如果您使用system.out.print()写入控制台,则输出不会显示,直到您调用flush,或者直到文本中有新行为止(在这种情况下,Java将调用flush你)。

详情请见this question

答案 1 :(得分:0)

实际上,FileOutputStream没有缓冲,因此数据直接写入文件。

抽象OutputStream定义flush(一个空方法)以满足缓冲流的需求,因此FileOutputStream继承它。

如果您不确定底层实现,通常最好在关闭流之前刷新流。

此外,在您的代码中有一点错误:

    file = new File("c:/newfile.txt");
    fop = new FileOutputStream("c:/newfile.txt");

    // Will never happen, new FileOutputStream creates the file
    if (!file.exists()) {
        file.createNewFile();
    }

修改

关于问题的close部分:

当您注释掉close(),然后退出main()时,终结器会调用close方法(即在流被垃圾回收之前,JVM线程会调用其finalize() }方法,它反过来调用close()方法),但你不能明智地依赖终结器:你不拥有它,你不能确定它何时被激活。

同样,最佳做法是明确调用close()