Monitorando uma pasta  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Sabatt
HelloWorld

Membro desde: 26/07/2009 08:03:02
Mensagens: 11
Offline

Olá, eu preciso criar um programa java que monitore uma pasta à minha escolha, e perceba quando eu crio ou altero um arquivo dentro dela. Eu achei pela net que existe uma classe FileSystemWatcher que faz isso, mas só funciona em Windows mas eu precisava que funcionasse em todos os SO.

Alguem sabe como eu posso fazer isso?

Obrigado desde já.
alevi
JavaChild
[Avatar]

Membro desde: 27/01/2007 13:58:04
Mensagens: 145
Offline

Olá!

Seu problema é dependente do OS - neste caso, vai ter que implementar uma solução para cada OS que for utilizar (a não ser que você consiga monitorar pela data etc).
Talvez seja necessário utilizar libraries nativas de cada plataforma (dll, so) e capturar o evento da pasta...

This message was edited 1 time. Last update was at 27/07/2009 11:20:21


http://www.walkersystems.com.br

SCJP
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Sabatt wrote:mas eu precisava que funcionasse em todos os SO.


"Funcione em todos os SOs"? Isso não existe em Java, mesmo usando apenas métodos dos pacotes java.* (nem os pacotes javax.* têm garantias de funcionarem em todos os SOs".

Reduza um pouco seu escopo (por exemplo, "quero que funcione em Windows, Linux c/ kernel 2.6 e Solaris 10") e veja o que é possível fazer em cada um.

(Por exemplo, em Windows você pode usar uma biblioteca nativa, como é o caso do tal FileSystemWatcher que você encontra na Internet, e em Linux talvez você ache algo semelhante).

Você pode ver se no Java 7 isso vai estar implementado, caso você possa usar uma versão beta do Java 7 (disponível em http://download.java.net/jdk7 ). Veja o pacote java.nio.file : http://download.java.net/jdk7/docs/api/java/nio/file/package-summary.html


[WWW]
Sabatt
HelloWorld

Membro desde: 26/07/2009 08:03:02
Mensagens: 11
Offline

Realmente eu me expressei mal. Não precisa ser todos mas os principais..

Pq minha empresa tem um aplicativo que faz isso, só que ele está escrito em Delphi, e a gente tava querendo mudar para Java. E eu precisava descobrir um jeito de monitorar uma pasta pelo menos no windows e no linux, mas a solução que eu achei só funciona no windows.

Utilizar uma solução para cada SO com dll's parece ser meio complicado... Mas obrigado pelas respostas

This message was edited 1 time. Last update was at 28/07/2009 10:00:20

lucamartins
JavaBaby
[Avatar]

Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline

Cara, eu tenho algo que talvez possa ajudar.

Coloquei em anexo os dois arquivos principais para isso.
Descrito abaixo, temos o metodo main que está dentro do arquivo DirPoolingController.

Inicialmente instanciamos a classe DirPoolingController e passamos como parametro o diretorio que queremos monitorar. Se o diretório nao existir ou não for um diretório uma exceção é lançada. Após, adicionamos a lista de eventos a implementação da Interface FileActionListener, este evento será disparado toda vez que for encontrado um arquivo que esteja de acordo com o regex passado como parametro para DirPoolingController.peekPooling(String regex). (Se você não conhece de regex aqui no forum tem um tutorial só sobre isso). Este mesmo metodo pode ser chamado sem parametros, então, ele traz todos os arquivos do diretório.

O pulo do gato para usar esta classe é usa-la em conjunto com a classe Timer do pacote java.utils, aonde vc pode mandar monitorar a pasta de tempos em tempos, após isso, é só salvar o ultimo array retornado e fazer uma comparação mais profunda (Arrays.deepEquals), ae vc tem na mão os arquivos modificados e que atendam a alguma regra especifica em relação ao nome.

Para usar esta classe em linux vc deve colocar o path para o arquivo de uma forma que ele entenda, né?




Inté!
 Nome do arquivo FileActionListener.java [Disk] Download
 Descrição
 Tamanho 361 bytes
 Baixado:  198 vez(es)

 Nome do arquivo DirPoolingController.java [Disk] Download
 Descrição
 Tamanho 5 Kbytes
 Baixado:  224 vez(es)

This message was edited 1 time. Last update was at 31/07/2009 13:50:47


== The C Style old school ==
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Só lembrando que a classe do Luca não depende de SO, mas você deve usar um intervalo de "polling" razoavelmente alto (maior que 5 segundos, digamos), porque ela lista os arquivos dentro de um diretório, o que não é uma operação muito rápida em Java.

A monitoração "nativa" de diretórios (que, no Windows, é feita através das APIs listadas em Obtaining Directory Change Notifications é mais rápida e eficiente, mas obviamente só funciona em Windows e requer um pouco de programação nativa (C, normalmente).
[WWW]
lucamartins
JavaBaby
[Avatar]

Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline

thingol wrote:Só lembrando que a classe do Luca não depende de SO, mas você deve usar um intervalo de "polling" razoavelmente alto (maior que 5 segundos, digamos), porque ela lista os arquivos dentro de um diretório, o que não é uma operação muito rápida em Java.

A monitoração "nativa" de diretórios (que, no Windows, é feita através das APIs listadas em Obtaining Directory Change Notifications é mais rápida e eficiente, mas obviamente só funciona em Windows e requer um pouco de programação nativa (C, normalmente).


Isto é verdade, no trabalho que participei do desenvolvimento esta foi a solução adotada. Eram gerados em média, 20.000 arquivos ao dia. No java, ele demorava alguns segundos para listar todos, no C era quase instantaneo. A solução adotada foi a de aumentar o tempo de pooling do diretório, mas o intervalo de 1s nos atendeu bem. Claro que vai depender de cada necessidade.

Foi legal você ter comentado isto, pois, sempre que chamar o peekPooling, DESATIVE o timer e volte a ativa-lo só depois do evento peekPerformed ter retornado. Assim pode-se evitar o pooling tão alto.

=)

P.S: Uma coisa importante, a classe limita a quantidade de arquivos retornados, por definição são 300 arquivos! Isto é parametrizado, pode-se escolher um limite qualquer. Não é validado um limite negativo, ele só não retorna nada!

This message was edited 2 times. Last update was at 31/07/2009 14:28:25

kotoko
Thread.start()

Membro desde: 23/04/2007 11:04:21
Mensagens: 36
Offline

Sei que este thread é já antigo mas peguei no código p experimentar e estou a ter o erro


quando uso o método addFileArraived.

Não tenho grande experiência a lidar com Listeners em Java confesso.

O que se passa?
labavel
JavaTeenager

Membro desde: 03/09/2009 10:27:57
Mensagens: 172
Offline

e alguem sabe como moveria estas informaçoes para um banco de Dados ?

Tipo tenho um novo arquivo na pasta faz um insert para o banco com caminho que vai ser fixo nome hora e tamanho variavel ? para que o monitoramento fosse via JSP?
lucamartins
JavaBaby
[Avatar]

Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline

labavel, quais informações? As que estão dentro do arquivo que vc monitorou?

kotoko, vc poderia por gentileza postar parte do seu código?

== The C Style old school ==
labavel
JavaTeenager

Membro desde: 03/09/2009 10:27:57
Mensagens: 172
Offline

Na realidade estou usando a seguinte função



Quero pegar tudo que estiver na pasta"nomes, data e horario, Tamanho" salvar os registros no banco. e depois excluir e mover os Dados

A função acima eu estou utilizando um time que a cada x segundos eu movimento os arquivos, porem com o post publicado posso adptalo para monitorar todos os arquivos por hora de imclusao
labavel
JavaTeenager

Membro desde: 03/09/2009 10:27:57
Mensagens: 172
Offline

eu reutilizei seu codigo utilizando um Timer


Alem do getName como eu pego a hora e o tamanho deste arquivo e gravo so os registros no Banco ?
lucamartins
JavaBaby
[Avatar]

Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline

labavel, o código serve simplesmente para retornar os arquivos que se encaixam na expressão regular passada para a classe DirPoolingController, vc deve usar o timer na sua classe e agendar uma tarefa, assim que o timer chamar o metodo run da classe TimerTask vc deve chamar o metodo peekPooling.

Agora, é só pesquisar sobre Timer e TimeTask e usa-los em conjunto com a classe DirPoolingController.


Cara, esse seu código acima pode ser substituido por , mas lembre-se que uma condição de parada é importante para o laço, ainda mais se ele estiver rodado na thread principal.

Alguns sites para vc ver como pegar o tamanho do arquivo, a data de criação e o conteúdo.

http://www.exampledepot.com/egs/java.io/getlength.html
http://www.javadb.com/get-file-size
http://java.sun.com/docs/books/tutorial/essential/io/file.html

At

This message was edited 2 times. Last update was at 06/05/2010 09:05:43


== The C Style old school ==
dheza
Smalltalk

Membro desde: 11/05/2010 10:50:10
Mensagens: 2
Offline

Oi Pessoal,

Vou utilizar o codigo que vcs postaram, só estou com 1 dúvida, devo colocar isso em uma thread?

Obrigada
fabiofalci
GUJ Master
[Avatar]

Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline

Uma opção é essa api da apache.
http://commons.apache.org/jci/

Apesar de ter um propósito diferente, ela tem uma classe

Que talvez te ajude.

Essa classe aqui tem um exemplo de uso: https://github.com/fabiofalci/unloading-java-class/blob/instrument/src/instrument/SimpleTransformer.java
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team