4

嗨,我需要一个关于 java 中的 I/O 流中是否需要刷新的答案。因为在我的程序中使用刷新和不刷新输出是相同的。即,所有内容都写入目标文件。那么为什么我需要刷新?文件输入流消耗缓冲内存?

下面是我的简单示例程序

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

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

4

2 回答 2

1

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

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

查看有关此问题的更多信息

于 2013-04-16T11:58:13.453 回答
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()显式调用。

于 2013-04-16T12:05:32.413 回答