можем ли мы открыть несколько потоков FileWriter в один и тот же файл одновременно?

#java

#java

Вопрос:

Можем ли мы открыть несколько потоков FileWriter в один и тот же файл одновременно. Я написал несколько кодов, чтобы проверить это, и, по-видимому, это позволяет произойти. Это меня смущает. Поскольку, если я открываю программу записи файлов в file, и прежде чем закрыть его, я пытаюсь удалить файл, ну, я не могу. Итак, как и почему я могу открыть несколько потоков FileWriter в один и тот же файл одновременно? Вот что я пытаюсь

 private static final int SIZE = 1000;

public static void main(String[] args) throws IOException, InterruptedException {
    File file = new File("C:\dev\harry\data.txt");
    FileWriter fileWriter = new FileWriter(file, true);
    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    for (int i = 0; i < SIZE; i  ) {
        bufferedWriter.write("1n");
        Thread.sleep(100);
    }

    if (bufferedWriter != null) bufferedWriter.close();
    if (fileWriter != null) fileWriter.close();
}
  

У меня есть другой процесс, который делает то же самое, но вместо этого записывает 2 , и я получаю оба 1 и 2 в моем файле данных.

Ответ №1:

Можем ли мы открыть несколько потоков FileWriter в один и тот же файл одновременно.

Да, это вполне возможно.

Итак, как и почему я могу открыть несколько потоков FileWriter в один и тот же файл одновременно?

Вы уже продемонстрировали, как открыть несколько экземпляров FileWriter, поэтому я остановлюсь на том, почему это возможно. В Java все операции на основе файлов или устройств обычно зависят от возможностей платформы. Вы можете рассматривать java.io и другие связанные пакеты как тонкие оболочки вокруг собственного кода в JVM, который фактически выполняет эту функциональность.

До Java 1.4 (когда вышел NIO) блокировка файлов в Java была невозможна, потому что JVM не выполняла соответствующие системные вызовы для конкретной платформы для блокировки файлов или диапазонов внутри файлов. Это изменилось с NIO, который доступен в java.nio пакете. В документации к классу FileChannel вы заметите следующее:

В дополнение к знакомым операциям чтения, записи и закрытия байтовых каналов, этот класс определяет следующие операции, относящиеся к конкретному файлу:

Область файла может быть заблокирована для доступа другими программами.

Такое поведение, как вы бы правильно догадались, связано с необходимыми вызовами, зависящими от платформы, выполняемыми JVM. Если базовая платформа не поддерживает это, блокировка файла не произойдет.

Что касается того, почему существует такое поведение с FileWriter, причина очень проста. NIO является / был набором новых классов ввода-вывода, но он не заменил java.io . Таким образом, вы могли бы продолжать использовать java.io такие классы, как FileOutputStream и FileWriter, но вы никогда не сможете заблокировать файлы JVM на время операции записи.

Ответ №2:

В документах FileWriter API говорится, что поведение зависит от платформы, и в документации нет ничего, что указывало бы, что FileWriter следует использовать, когда вы хотите эксклюзивную блокировку файла.

Вероятно, вам следует посмотреть и рассмотреть возможность использования FileChannel вместо этого. Этот класс имеет надлежащую поддержку для блокировки файлов и предотвращения одновременной записи двух потоков в один и тот же файл.