#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
вместо этого. Этот класс имеет надлежащую поддержку для блокировки файлов и предотвращения одновременной записи двух потоков в один и тот же файл.