我有一个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();
}
}
答案 0 :(得分:3)
FileOutputStream
不使用任何缓冲区,因此flush方法为空。不管是否调用它都是没有用的。
类
FileOutputStream
的源代码没有自定义版本的 方法冲洗。所以使用的flush方法是其super的版本 类OutputStream
。OutputStream
中的flush代码是 正在关注
public void flush() throws IOException {
}
有关更多信息,请参见此答案