能否保证FileOutputStream.flush()确保其他进程可以一致地读取文件内容?

时间:2018-07-02 07:22:49

标签: java linux io

我有一个Java进程A,它调用FileOutputStream.flush()刷新内容,并有另一个进程B来读取文件内容。在大多数情况下,进程B会很好地读取内容。但是,有时B会报告内容不正确。

我的问题是,如果在调用FileOutputStream.close()之前调用FileOutputStream.flush()之后编写器进程崩溃,那么Java运行时是否可以保证读者仍然可以读取刷新之前写入的全部内容?我们是否必须调用FileOutputStream.getFD().sync()以确保文件已写入磁盘?

以下是我在这种情况下的测试程序:

作家:(请注意,我故意不调用FileOutputStream.close())

import java.io.File;
import java.io.FileOutputStream;

public class Main {

    public static void main(String[] args) throws Exception {

        for (int j = 0; j < 100; j++) {
            File file = new File("/tmp/test");
            if (file.exists()) {
                file.delete();
            }

            FileOutputStream outputStream = null;
            outputStream = new FileOutputStream("/tmp/mytest");
            String content = "";
            for (int i = 0; i < 100 - j; i++) {
                content += "," + Integer.toString(i);
            }

            outputStream.write(content.getBytes());
            outputStream.flush();
            System.exit(-1);
        }
   }
}

阅读器:

import java.io.File;
import java.util.Scanner;

public class MyReader {

    public static void main(String[] args) throws  Exception {
        File file2 = new File("/tmp/mytest");
        Scanner sc = new Scanner(file2);

        while (sc.hasNextLine())
            System.out.println(sc.nextLine());
        sc.close();
    }

}

1 个答案:

答案 0 :(得分:3)

FileOutputStream不使用任何缓冲区,因此flush方法为空。不管是否调用它都是没有用的。

  

FileOutputStream的源代码没有自定义版本的   方法冲洗。所以使用的flush方法是其super的版本   类OutputStreamOutputStream中的flush代码是   正在关注

public void flush() throws IOException {
}

有关更多信息,请参见此答案

flush and close