Ler arquivo enquanto esse eh escrito

Galera preciso ler um arquivo que estara sendo escrito ao mesmo tempo que eu vou le-lo. Eh um arquivo de log que o sistema gera e eu preciso ler esse arquivo, mas se enquanto o programa estiver rodando algo for acrescentado no arquivo eu preciso ler esse novo dado, de preferencia sem precisar ler todo o arquivo novamente. Alguem pode em ajudar?

VLW

Unix: tail -f
Windows: http://www.baremetalsoft.com/baretail/index.php

[quote=entanglement]Unix: tail -f
Windows: http://www.baremetalsoft.com/baretail/index.php[/quote]

Vlw, mas eu preciso fazer isso via codigo java…

Caso você queira desenvolver seu próprio sistema em java que monitore arquivos em windows, vocÊ pode utilizar apis de sincronismo de “HANDLERS”. De forma que você consegue notificações de mudanças de arquivo. Para isso existe a dll do windows que trabalha com isso:

VocÊ poderia utilizar notificações para informar um leitor que ele pode tentar ler uma linha a mais a partir da última lida.
Dê uma pesquisada em exemplos de uso de toda a api de sincronismo do windows:

http://msdn.microsoft.com/en-us/library/ms686360(v=VS.85).aspx

Good Luck. :slight_smile:

Para fazer algo semelhante ao tail (Unix), você deve dar uma olhada no código-fonte do tail (que é em C, sorry). Basicamente ele lê alguns milhares de bytes do arquivo (usando algo semelhante ao RandomAccessFile) e então divide esse final do arquivo em linhas. Você NÃO pode usar algo como o FileReader para fazer o que você quer (mas você até poderia tentar usar um ByteArrayInputStream + InputStreamReader + BufferedReader para dividir os bytes em linhas, o que no seu caso é “overkill” porque você simplesmente pode procurar a sequência de bytes 0x13 0x10 (CR LF) ou 0x10 (LF) para determinar onde termina uma linha. Então, periodicamente, você tem de obter o novo tamanho do arquivo (porque ele vai crescendo, não se esqueceu disso?) e ler mais aqueles bytes que foram acrescentandos, ou então mais os últimos milhares de bytes (depende, é claro, da velocidade de crescimento de arquivo e com que velocidade você consegue mostrar as linhas na tela).
Então, em Java, as classes necessárias são: java.io.RandomAccessFile (para ler os bytes), java.io.File (para obter o tamanho do arquivo), e mais algumas outras.