Может ли FileOutputStream.flush () гарантировать, что другие процессы могут последовательно считывать содержимое файла? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть 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();
    }

}

1 Ответ

0 голосов
/ 02 июля 2018

FileOutputStream не использует буфер, поэтому метод очистки пуст. Называть это или нет бесполезно.

Исходный код класса FileOutputStream не имеет пользовательской версии метод флеш. Таким образом, используемый метод сброса является версией его супер класс OutputStream. Код флеша в OutputStream является Следующий

public void flush() throws IOException {
}

См. Этот ответ для получения дополнительной информации:

сбрасывать и закрывать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...