Tem como abrir um arquivo em modo exclusivo em Java?
Abrir arquivo em modo exclusivo
8 Respostas
Abrir arquivo em modo exclusivo? Tah mexendo com Netware, Wellington? hehehehe

Resposta curta-e-grossa: nao dá. Isso nao eh uma caracteristica multiplataforma (em alguns - todos? - os Unices, vc só pode abrir um arquivo em modo exclusivo se vc for root, e como todos sabemos, isso nao funciona bem ;))
OK eu já desconfiava, mas vou ter que contornar o problema de outra forma mais “multiplataforma”.
Um truque que o pessoal de *nix usam bastante, é verificar a existencia de um outro arquivo “/var/lock/arquivo_em_uso”, mas no meu caso alguém pode copiar o arquivo manualmente para o diretório sem criar este arquivo :?
Minha aplicação precisa ficar monitorando a filesystem, e processar um arquivo que chegar.
O problema é saber quando a copia foi terminada.
Imaginei algo do tipo:
pega o nome do arquivo e joga em um Hash com um objeto Date, e verifica se nos ultimos segundos ele não modificou de tamanho.
Acho que com isso posso me “assegurar” que acabou o trabalho de gravação/cópia do arquivo para o diretório que fico monitorando.
Sugestões são bem vindas
[]s, Welington B. Souza
Não sei se tem alguma coisa a ver.
Mas você já pensou em fazer um Socket Server para manipular o arquivo?
:arrow: Desta forma uma única aplicação irá manipular o arquivo.
Falow… 
hmmmm… como eh esse arquivo? não tem nenhuma marca pra te deixar pelo menos saber q a cópia dele foi finalizada?
Outra idéia era ter uma Thread que checasse, de tempos em tempos, se o arquivo tá lá, e se estiver, comece a ler mesmo que ele não tenha terminado de chegar ainda. Os BufferedReaders e BufferedInputStream sabem se virar bem com isso 
:arrow: Seguindo a linha do cv. Ou quem sabe até um segundo arquivo, se ele existir a cópia foi terminada…
O arquivo pode ser gerado por outra aplicação, de outra estação na rede, ou copiada de outra estação (na mão mesmo).
Já tenho uma Thread que fica monitorando de tempos em tempos a filesystem. Quando terminar o processamento, tenho que mover o arquivo para outra pasta.
Quando copiei um arquivo na máquina, não sei como, mas ele processou somente algumas linhas, e posteriormente foi copiado (também parcialmente) e removido (programei isso).
Estou usando FileReader + BufferedReader para ler o arquivo, mas chega um ponto que ele lê e retorna null daí saio do loop que lê.
Alguma coisa errada na estratégia?
[]s, Welington B. Souza
Java tem suporte a advisorial file locking a partir da 1.4.
Ou seja, teu flock falha se outra aplicação já possuir um lock em parte da região solicitada, porém não fica impedida de modificar o arquivo.
Se voce tem controle da outra aplicação pq não implementa IPC entre elas?
Heis a questão, não tenho controle da outra aplicação.
É um sistema de integração, onde várias aplicações podem gravar neste local. Meu dever é ler e processar os arquivos que caírem neste local.
[]s, Welington B. Souza