У меня есть Java-процесс A
, который вызывает FileOutputStream.flush () для очистки содержимого, и есть другой процесс B
для чтения содержимого файла. В большинстве случаев процесс B
читает содержимое нормально. Однако иногда B
сообщает о получении некорректного содержимого.
Мой вопрос заключается в том, что если процесс записи завершается с ошибкой сразу после вызова FileOutputStream.flush () перед вызовом FileOutputStream.close (), может ли среда выполнения Java гарантировать, что читатель все еще сможет прочитать весь контент, записанный до сброса? Должны ли мы вызывать FileOutputStream.getFD().sync()
, чтобы убедиться, что файл записан на диск?
Вот моя тестовая программа для этого случая:
Writer: (обратите внимание, что я намеренно не вызываю 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();
}
}