2011-04-15 10 views
7

por lo que utiliza lo siguiente para crear un bloqueo en un archivo para que pueda editarlo exclusivamente:En Java, ¿hay alguna manera de leer un archivo cuando ese archivo está bloqueado por otro hilo?

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

ahora tengo un segundo hilo que desee acceder al mismo archivo - sólo para leer, no editar. ¿Cómo puedo hacer eso? En este momento, el segundo hilo lanzará una excepción io e informará que el archivo está bloqueado.

¿Es esto factible? ¿Alguna sugerencia? Gracias

Respuesta

3

Se podría intentar pedir un bloqueo compartido usando la versión de tres argumentos de trylock.

Aquí es el javadoc apropiado: http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileChannel.html#tryLock%28long,%20long,%20boolean%29

Básicamente en lugar de hacer lock=channel.tryLock() que haría lock = channel.trylock(0, Long.MAX_VALUE, true)

Como acotación al margen, hay que tener cuidado con el bloqueo de archivos en java. Si bien puede garantizar que los bloqueos se comporten como se espera dentro de la JVM, no necesariamente puede estar seguro de que se comportarán como se espera en múltiples procesos.

+0

thx intentaré eso – neo

1

Normalmente, bloquear un archivo se basa en el sistema operativo, y cuando se toma un bloqueo de escritura es exclusivo por el hilo en el que lo toma. Sin embargo, una cosa que podrías hacer es compartir el objeto de archivo entre los hilos (pero ten cuidado con las condiciones de carrera). File locking

1

Quizás esto ayude!

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

intenta adquirir un bloqueo en la región dada del expediente de este canal.

Este método no bloquea. Una invocación siempre devuelve inmediatamente, ya sea que haya adquirido un bloqueo en la región solicitada o que haya fallado en . Si no puede adquirir un bloqueo porque un bloqueo superpuesto se mantiene por otro programa, entonces devuelve nulo. Si no puede adquirir un candado por cualquier otro motivo , se produce una excepción apropiada.

La región especificada por los parámetros de posición y tamaño no necesitan contenerse, o incluso superponerse, el archivo subyacente real. Las regiones Lock tienen un tamaño fijo; si una región bloqueada contiene inicialmente el final de y el archivo crece más allá de la región , entonces la nueva parte del archivo no estará cubierta por el bloqueo. Si se espera que un archivo a crecer en tamaño y un bloqueo en el archivo completo es requerido continuación, una región a partir de las cero, y no más pequeño que el tamaño máximo esperado del archivo, se debe bloqueado. El método zero-argument tryLock() simplemente bloquea una región del tamaño Long.MAX_VALUE.

Algunos sistemas operativos no son compatibles con las cerraduras común, en cuyo caso una solicitud para un bloqueo compartido se convierte automáticamente en una solicitud para un bloqueo exclusivo. Si el candado recién adquirido es compartido o exclusivo puede probarse invocando el método del objeto de bloqueo resultante isShared .

Los bloqueos de archivos se llevan a cabo en nombre de toda la máquina virtual de Java. No son adecuados para controlar el acceso a un archivo por varios hilos dentro de la misma máquina virtual.

Parámetros: posición - La posición en la cual se iniciará la región bloqueada; debe ser no negativo tamaño - El tamaño de la región bloqueada; debe ser no negativo, y la posición + tamaño suma debe ser no negativo compartidos - fiel a solicitar un bloqueo compartido, falsa para solicitar una bloqueo exclusivo Devuelve: un objeto de bloqueo que representa la cerradura recién adquirido, o null si el bloqueo no podía ser adquirida debido otro programa mantiene un bloqueo superposición Lanza: IllegalArgumentException - Si las condiciones previas sobre los parámetros no no tienen ClosedChannelException - Si este canal está cerrado OverlappingFileLockException - Si una cerradura que se superpone al pedido región ya se lleva a cabo por esta máquina virtual Java , o si otro hilo ya está bloqueada en este método y está intentando bloquear un zona de solapamiento del mismo archivo IOException - Si se produce algún otro error I/O Ver también: lock(), lock(long,long,boolean), tryLock()

Cuestiones relacionadas