Как я могу заблокировать файл из приложения Java для всех других процессов в операционной системе? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть файл, который мне нужно прочитать несколько раз. Я должен открыть InputStream для того же файла в последовательности. Теперь мне интересно, можно ли заблокировать этот файл для всей ОС , если задана c часть приложения Java?

Я хочу запретить 3 от события:

  1. Чтение файла example.txt из myApp. java
  2. Прекращение чтения файла example.txt
  3. Другой процесс пишет файл (т.е. echo "foo" >> example.txt)
  4. Чтение файла example.txt из myApp. java

Насколько я понимаю, блокировка java.nio.FileChannel блокирует только доступ в файл для других приложений JVM.

Ответы [ 3 ]

1 голос
/ 11 марта 2020

API Java для этого java.nio.channels.FileLock. Вы говорите:

Насколько я понимаю, java.nio.FileChannel блокировка блокирует доступ только к файлу для других приложений JVM.

Это понимание неверно. Из документации FileLock:

Зависимости платформы

Этот API блокировки файлов предназначен для непосредственного сопоставления с собственными средствами блокировки базовой операционной системы. Таким образом, блокировки, хранящиеся в файле , должны быть видны всем программам, которые имеют доступ к файлу, независимо от языка, на котором эти программы написаны [выделение добавлено] .

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

[...]

Однако, как вы можете видеть, точная природа блокировки определяется платформой c.

0 голосов
/ 11 марта 2020

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

1. Load the file and rename it. For example, example.txt to example.txt.tmp
2. Reading file example.txt.tmp from myApp.java
.....
6. Rename your file name back to the original one.
0 голосов
/ 11 марта 2020

Файловые системы являются спецификацией ОС / реализации c WRT "блокировка", и я предполагаю, что для того, чтобы сделать это надежно, вы должны сделать это с помощью прав доступа к файлу.

Вы не даете никакой информации о Тип ОС / файловой системы, поэтому нет конкретного ответа c.

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

...