Leitura contínua no arquivo: FileInputStream/BuffereReader?

Pessoal,

Boa tarde!

Gostaria de saber se existe uma maneira de efetuar uma leitura em arquivo txt contínua… O sistema aqui da empresa, gera LOG’s de execução diários com mais de 30 mil linhas…

Tenho que fazer uma aplicação em JAVA, procurando por erros no arquivo…
Eu queria saber se existe uma maneira de ler o arquivo até a ultima linha e aguardar surgir novas para continuar a leitura…

Se eu ficar lendo o arquivo todo… ira deixar a aplicação muito pesada e demorada para ficar lendo o arquivo do começo ao final o tempo todo…

Pensei em algo neste tipo: verificar o tamanho do arquivo, se ele for alterado continuo lendo as linhas apartir de onde ele parou…
Só que não está dando certo…

Alguém tem alguma idéia? Obrigado desde ja…

Att,
Alexandre Pestana

Entendi seu problema, esse arquivo é gerado numa maquina linux ou windows?

Se for linux, ta facil facil, agora, se for windows, sugiro voce colocar numa thread com baixa prioridade e no run() dela colocar um while (true), mais ou menos assim:

ATENCAO, FIZ ISSO TUDO NA MAO AQUI NO FORUM, EH SO A IDEIA, VOCE VAI TER QUE IMPLEMENTAR DO SEU JEITO.

public class MyThreadFileMonitor extends Thread{

BufferedReader br;
StringBuffer dados = new StringBuffer();
boolean novosDados = false;

Public MyThreadFileMonitor(File f){

 br = new BufferedReader(new FileReader(f));

}

@overide
public void run(){
       while (true) {

                 linha = br.readLine();
                 
                 if (linha != null){
                              apendDados(linha);
                }

                Thread.sleep(1000); ///1 segundo

       }
}


private void appendDados(String linha){
      dados.append(linha);
      this.novosDados = true;
}

public syhncronized String getNovosDados(){
      this.novosDados = false;
      return this.dados.toString();
}

public boolean temNovosDados(){
       return this.novosDados;
}

}

E depois voce faria uma outra thread que ficaria monitorando esta thread, esta segunda thread ficaria observando o temNovosDados() e quando ele for true, ele chama o getNovosDados, que por ser sincronizado vai impedir a thread principal de gravar novos dados enquanto a segunda trhead esta obtendo os dados da trhead principal.

Nao sei se fui claro, qualquer coisa pergunte mais, alem disso, diga se o servidor eh windows ou linux.

Outra coisa, do jeito que eu fiz essa thread, ela vai percorrer todo o arquivo e depois vai ficar monitorando o final dele. Se voce nao quiser que ela percorra todo o arquivo, tem que fazer alguma coisa para ela saltar pro final logo de cara.

Saudacoes,

Kemper

[quote=kemperacc]
Entendi seu problema, esse arquivo é gerado numa maquina linux ou windows?

Se for linux, ta facil facil, agora, se for windows, sugiro voce colocar numa thread com baixa prioridade e no run() dela colocar um while (true), mais ou menos assim:

ATENCAO, FIZ ISSO TUDO NA MAO AQUI NO FORUM, EH SO A IDEIA, VOCE VAI TER QUE IMPLEMENTAR DO SEU JEITO.

public class MyThreadFileMonitor extends Thread{

BufferedReader br;
StringBuffer dados = new StringBuffer();
boolean novosDados = false;

Public MyThreadFileMonitor(File f){

 br = new BufferedReader(new FileReader(f));

}

@overide
public void run(){
       while (true) {

                 linha = br.readLine();
                 
                 if (linha != null){
                              apendDados(linha);
                }

                Thread.sleep(1000); ///1 segundo

       }
}


private void appendDados(String linha){
      dados.append(linha);
      this.novosDados = true;
}

public syhncronized String getNovosDados(){
      this.novosDados = false;
      return this.dados.toString();
}

public boolean temNovosDados(){
       return this.novosDados;
}

}

E depois voce faria uma outra thread que ficaria monitorando esta thread, esta segunda thread ficaria observando o temNovosDados() e quando ele for true, ele chama o getNovosDados, que por ser sincronizado vai impedir a thread principal de gravar novos dados enquanto a segunda trhead esta obtendo os dados da trhead principal.

Nao sei se fui claro, qualquer coisa pergunte mais, alem disso, diga se o servidor eh windows ou linux.

Outra coisa, do jeito que eu fiz essa thread, ela vai percorrer todo o arquivo e depois vai ficar monitorando o final dele. Se voce nao quiser que ela percorra todo o arquivo, tem que fazer alguma coisa para ela saltar pro final logo de cara.

Saudacoes,

Kemper[/quote]

Olá Kemper, muito obrigado!
É isso mesmo que estou precisando… Estava até agora quebrando a cabeça de como fazer isso, só que vou ter que dar uma análisada legal, pq Thread eu não manjo muito bem, mas vou fazer o possivel… Mas a minha vida foi sempre assim, vivendo e aprendendo com meus colegas…

Eu vou ver como implemento aqui… Então o servidor é Windows…

Obrigado desde já…

Se fosse linux era mais facil, hehehe, nem precisava de programa em java, um unico comando, e garanto de em menos de meio segundos as 30 mil linhas seriam processadas.

hehehehe

[]s

[quote=kemperacc]Se fosse linux era mais facil, hehehe, nem precisava de programa em java, um unico comando, e garanto de em menos de meio segundos as 30 mil linhas seriam processadas.

hehehehe

[]s[/quote]

Kemper,

fiz um teste bem simples aqui, sem adotar as Tread ainda… E funcionou perfeitamente, conforme seu auxilio…
Agora, como você falou ele percorre todo o arquivo, ou seja ele faz um print do arquivo todo se eu alterar o mesmo…

Você sabe o comando para setar para o final do arquivo?


import java.io.*;

public class MyThreadFileMonitor extends Thread{

BufferedReader br;
StringBuffer dados = new StringBuffer();
boolean novosDados = false;

String linha;

public MyThreadFileMonitor(File f) throws FileNotFoundException{

br = new BufferedReader(new FileReader(f));
run();

}

@overide
public void run(){
       while (true) {

           try{  
        	  
        	   linha = br.readLine();
        	   
        	   if (linha != null){
            	   appendDados(linha);
               }

               Thread.sleep(1000); ///1 segundo
               
               if(temNovosDados()){
                  	String teste = getNovosDados();
                  	System.out.println(teste);
               }
           
           }catch(Exception e){
        	   
           }
                
                
       }
}


private void appendDados(String linha){
      dados.append(linha);
      this.novosDados = true;
}

public synchronized String getNovosDados(){
      this.novosDados = false;
      return this.dados.toString();
}

public boolean temNovosDados(){
       return this.novosDados;
}

public static void main(String[] args) {
	try{
		File arquivo = new File("teste.txt");
		new MyThreadFileMonitor(arquivo);
		
	}catch(Exception e){
		
	}
}
}

Acrredito o que estou pensando fazer vai dar certo… obrigado mais uma vez…

Att,
Alexandre Pestana