В Java, есть ли способ прочитать файл, когда этот файл заблокирован другим потоком? - PullRequest
7 голосов
/ 15 апреля 2011

Итак, я использовал следующее, чтобы создать блокировку файла, чтобы я мог редактировать его исключительно:

 File file = new File(filename);
 channel = new RandomAccessFile(file, "rw").getChannel();
 lock = channel.tryLock();

Теперь у меня есть 2-й поток, который хочет получить доступ к тому же файлу - просто для чтения, а нередактировать.Как я могу это сделать?Прямо сейчас 2-й поток выдаст исключение io и сообщит мне, что файл заблокирован.

Это выполнимо?Какие-либо предложения?Спасибо

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Вы можете попробовать запросить общую блокировку, используя три аргумента версии tryLock.

Вот соответствующий javadoc: http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileChannel.html#tryLock%28long,%20long,%20boolean%29

По сути, вместо того, чтобы делать lock=channel.tryLock(), вы бы сделали lock = channel.trylock(0, Long.MAX_VALUE, true)

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

1 голос
/ 15 апреля 2011

Может быть, это поможет!

public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                         throws IOException

Попытки получить блокировку в заданной области файла этого канала.

Этот метод не блокирует.Вызов всегда возвращается немедленно, либо установив блокировку в запрашиваемой области, либо не выполнив ее.Если ему не удается получить блокировку из-за того, что другая программа удерживает перекрывающуюся блокировку, возвращается нулевое значение.Если не удается получить блокировку по какой-либо другой причине, выдается соответствующее исключение.

Область, указанная параметрами position и size, не обязательно должна содержаться внутри или даже перекрывать фактический базовый файл.Блокировка областей фиксирована по размеру;если заблокированная область изначально содержит конец файла и файл выходит за пределы области, то новая часть файла не будет закрыта блокировкой.Если ожидается, что размер файла увеличится, и требуется блокировка всего файла, необходимо заблокировать область, начинающуюся с нуля и не меньшую, чем ожидаемый максимальный размер файла.Метод с нулевым аргументом tryLock() просто блокирует область размером Long.MAX_VALUE.

Некоторые операционные системы не поддерживают общие блокировки, и в этом случае запрос общей блокировки автоматически преобразуется в запрос наэксклюзивный замок.Независимо от того, является ли вновь приобретенная блокировка общей или исключительной, можно проверить, вызвав метод isShared результирующего объекта блокировки.

Блокировки файлов сохраняются от имени всей виртуальной машины Java.Они не подходят для управления доступом к файлу несколькими потоками на одной виртуальной машине.

Параметры: position - позиция, с которой должна начинаться блокированная область;должен иметь неотрицательный размер - размер заблокированной области;должно быть неотрицательным, а сумма позиции + размер должны быть неотрицательными для общего доступа - true для запроса общей блокировки, false для запроса исключительной блокировки Возвращает: объект блокировки, представляющий вновь полученную блокировку, или ноль, если блокировка моглане может быть получено, потому что другая программа содержит перекрывающуюся блокировку. Выдает: IllegalArgumentException - если предварительные условия для параметров не выполняются ClosedChannelException - если этот канал закрыт OverlappingFileLockException - если блокировка, перекрывающая запрашиваемую область, уже удерживаетсяэта виртуальная машина Java, или если другой поток уже заблокирован в этом методе и пытается заблокировать перекрывающуюся область того же файла IOException - если происходит какая-либо другая ошибка ввода / вывода См. также: lock(), lock(long,long,boolean),tryLock()

1 голос
/ 15 апреля 2011

Обычно блокировка файла выполняется в операционной системе, и когда вы берете блокировку записи, она является исключительной для потока, в котором вы его берете.Тем не менее, вы могли бы делить объект файла между потоками (но будьте осторожны с условиями гонки). Блокировка файла

...