Сообщение о другом процессе просто означает, что какой-то процесс в вашей системе имеет открытый файл. На самом деле он не проверяет, что этот процесс совпадает с тем, который пытается удалить / переименовать файл. В этом случае эта же программа имеет открытый файл. Вы открыли его, чтобы получить замок. Блокировка здесь практически не имеет значения, особенно если вы делаете это для операций удаления или переименования.
Чтобы сделать то, что вы хотите, вам нужно заблокировать запись в каталоге. Это недоступно в Java и может быть недоступно в Windows. Эти операции (удаление и вставка) являются атомарными. Это означает, что операционная система позаботится о блокировке каталога и других структур файловой системы. Если файл открыт другому процессу (или вашему), эти операции завершатся неудачно. Если вы пытаетесь заблокировать файл исключительно (запись в каталоге), и другой процесс (или ваш собственный) открывает файл, блокировка завершится неудачей. Разницы нет, но попытка сделать блокировку просто усложняет, и в этом случае делает операцию невозможной (то есть файлы всегда открываются до того, как вы попытаетесь выполнить операцию).
Теперь запись в файл является допустимой операцией блокировки. Заблокируйте файл или часть файла, в который вы хотите записать, и тогда он будет работать. В Windows этот механизм блокировки является обязательным, поэтому другой дескриптор открытия / файла не сможет выполнять запись в любую часть, находящуюся под блокировкой.
EDIT
Согласно JavaDoc на FileChannel.lock
, это то же самое, что и вызов FileChannel.lock(0L, Long.MAXVALUE, false)
. Это эксклюзивная блокировка области от первого байта до последнего.
Во-вторых, согласно JavaDoc на FileLock
То, будет ли блокировка фактически запрещать доступ другой программы к содержимому заблокированной области, зависит от системы и, следовательно, не определено. Собственные средства блокировки файлов в некоторых системах просто рекомендательные, это означает, что программы должны совместно соблюдать известный протокол блокировки, чтобы гарантировать целостность данных. В других системах собственные блокировки файлов являются обязательными. Это означает, что если одна программа блокирует область файла, то другим программам фактически запрещается доступ к этой области способом, который нарушил бы блокировку. В других системах независимо от того, являются ли собственные блокировки файлов рекомендательными или обязательными, их можно настраивать отдельно для каждого файла. Чтобы обеспечить согласованное и правильное поведение на разных платформах, настоятельно рекомендуется использовать блокировки, предоставляемые этим API, как если бы они были консультативными блокировками .
EDIT
Для метода testWrite
. JavaDoc для статического метода ввода-вывода commons является разреженным, но говорит: «Записывает строку в файл, создавая файл, если он не существует ...», и, поскольку этот метод принимает File
вместо открытого потока, он, скорее всего, открывает файл внутри. Возможно, он не открывает файл с общим доступом, а также открывает доступ для добавления. Это означает, что существующее открытие и блокировка (ваше открытие, чтобы получить канал, из которого можно получить блокировку) блокируют это использование. Чтобы понять еще больше, вам нужно получить исходный код этого метода и посмотреть, что он делает.
EDIT
Извините, я исправлен. Я проверил Windows API и блокировка файлов является обязательной в Windows. Вот почему запись не удалась. При первом открытии (new RandomAccessFile
) и блокировке файл заблокирован. Открытие для записи строки завершается успешно, но запись завершается неудачно, потому что другое открытие (дескриптор файла) имеет полный экстент файла с обязательной эксклюзивной блокировкой, то есть никакой другой дескриптор файла не может записать в файл, пока не будет снята блокировка.
Обратите внимание, что блокировка связана с дескриптором файла NOT процесса или потока.