Подходит ли следующая гарантия кода Java и эксклюзивный замок на неоткрытом файле в Windows?
-
13-09-2020 - |
Вопрос
делает следующий код Java, гарантирует эксклюзивный замок на неоткрытый файл в Windows?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("mylog.log");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.getChannel().lock();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
. Решение
Как можно увидеть в Java Specs:
Файловые замки удерживаются от имени всей виртуальной машины Java.Они не подходят для управления доступом к файлу несколькими потоками на одной виртуальной машине.
Так что, если вам нужен эксклюзивный замок для резьбы, пожалуйста, выберите другой путь.
Другие советы
Хорошие новости: Вы пытаетесь убедиться, что у вас есть механизм блокировки в потоке в вашем приложении? Если это так, FileLock
достаточно (предполагая, что остальная часть приложения состоит из правильно написанного потоковым кодом, конечно).
Плохие новости: К сожалению, если вы пытаетесь убедиться, что Windows уступит ваш замок по всем приложениям, вы не можете рассчитывать на это.
Это легко наблюдать в Windows: вы часто можете перезаписать файлы, которые записываются (когда файлы журнала становятся слишком длинными, у меня есть Emacs, например, все предыдущие спам). Тем не менее, Windows обычно не позволит вам удалить открытый файл.
файловые замки проводятся от имени Вся виртуальная машина Java. Они есть не подходит для контроля доступа к файл несколькими потоками в пределах Та же виртуальная машина.
Объекты блокировки файлов безопасны для использования несколько одновременных потоков.
... а позже ...
или нет ли замок на самом деле предотвращает другую программу от Доступ к содержанию заблокированного регион зависит от системной системы и поэтому не указано. Родной Устройства блокировки файлов некоторых системы просто консультационные, значения что программы должны сотрудничать Соблюдайте известный протокол блокировки в Чтобы гарантировать целостность данных. На Другие системы нативных блокировков файлов Обязательно, что означает, что если одна программа блокирует область файла, а затем другой Программы фактически предотвращаются от доступ к этой области таким образом, чтобы нарушит замок. На еще другом Системы, являются ли нативные блокировки файлов Консультативный или обязательный настраиваемый на за материалом. Для обеспечения последовательное и правильное поведение по всему платформы, это настоятельно рекомендуется что замки, предоставленные этой API, будут Используется как если бы они были консультативными замками.
Даже если вы используете флаги блокировки и разблокировки для файла, вы гарантируете только, что у вас есть исключительный замок
Вы либо должны использовать JNI, либо другой компьютерный язык, чтобы сделать вызовы Windows, чтобы гарантировать эксклюзивный замок в файле Windows.
Windows Функция Lockfile
Windows unlockfile Функция