Varrer o mesmo arquivo várias vezes

Amigos,

bom dia!

Tenho a necessidade de ler um arquivo TXT como um LOOP mas só estou conseguindo ler a primeira vez, ele não esta repetindo o processo, entenderam?

A idéia é fazer uma “simulação” da entrada de dados pela porta serial, só que ao inves de ter o “componente” conectado a porta para a entrada de dados vou
simular que o componente esteja enviando esses dados lendo de um arquivo txt o mesmo conteúdo repetidas vezes…

Espero que tenha me expressado bem.
Agradeço quem puder me ajudar…

Estou usando THREADS, ou tentando pelo menos.

Meu código:

[code]public class LeArquivo extends Thread {

private File filename;
private ComunicadorSerial comSerial;
private FileReader reader;
private BufferedReader leitor;

// a classe le dados pela porta serial (será simulado que os dados do arquivo em questão estejam vindo da porta serial!!!)
// a partir dessa leitura eu vou trabalhar os dados lidos depois.

public LeArquivo(File filename, ComunicadorSerial comSerial) {
    this.filename = filename;
    this.comSerial = comSerial;
}

@Override
@SuppressWarnings("CallToThreadDumpStack")
public void run() {
    while (this.isInterrupted() == false) {
        String palavra = "";
        Simulador.txtArquivo.setText("");  // nesta linha eu apresento os dados lidos em uma textArea na tela do meu projeto.
        try {
            reader = new FileReader(filename);
            leitor = new BufferedReader(reader);
            while (leitor.ready()) {
                int caracter = leitor.read();
                palavra = String.valueOf(caracter);
                while (palavra != " ") {
                    palavra = palavra + palavra;
                    Simulador.txtArquivo.append(palavra + " \n ");
                }
            }
            reader = new FileReader(filename);
            leitor = new BufferedReader(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        leitor.close();
        reader.close();
    } catch (IOException ex) {
        Logger.getLogger(LeArquivo.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}[/code]

Meu arquivo.txt está assim:

abcdef ghijkl mnopqr stuvwx yz
repete1
abcdef ghijkl mnopqr stuvwx yz
repete2
abcdef ghijkl mnopqr stuvwx yz
repete3
abcdef ghijkl mnopqr stuvwx yz
repete4
abcdef ghijkl mnopqr stuvwx yz
repete5
abcdef ghijkl mnopqr stuvwx yz
repete6

Sendo que a saída (netBeans) esta assim:
Obs.: Encurtei o tamanho da saída…

9797
97979797
9797979797979797
97979797979797979797979797979797
9797979797979797979797979797979797979797979797979797979797979797
97979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797
97979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797

CONSTRUÍDO COM SUCESSO (tempo total: 27 segundos)

este seu while abaixo esta infinito… variavel palavra jamais será " ", e Comparação de Strings devem utilizar o método Equals().

while (palavra != " ") { palavra = palavra + palavra; Simulador.txtArquivo.append(palavra + " \n "); }

douglaskd obrigado pela ajuda, realmente não me atentei para a leitura que faz com que a condição da “palavra” não seja atendida.
Entretanto meu problema continua e pelo que percebi devo estudar mais.

Na verdade eu quero pegar a linha (exemplo: “abcdef ghijkl mnopqr stuvwx yz”) que foi lida com o “readline()” e separar os campos pelo espaço (ou outro caracter) entre as palavras, mas não apenas separar e sim usar cada “palavra” gerada separadamente, ou seja, na linha de exemplo lida preciso obter:

RESULTADO ESPERADO.
palavra[0] == abcdef
palavra[1] == ghijkl
palavra[2] == mnopqr
palavra[3] == stuvwx
palavra[4] == yz

Sendo que na verdade eu apresento esse “resultado no textArea”.

Entendeu?

Se tiver como clarear minha dúvida agradeço.

Respeitosamente,

Cara, não entendi muito bem como vc está lendo o arquivo mas acho q o código abaixo pode ajudá-lo a “clarear suas idéias”, geralmente leio arquivo dessa forma, talvez vc possa aproveitar alguma coisa.

try {
    // Caminho completo do arquivo a ser lido
    File arquivo = new File("arquivoASerLido");
    FileReader fr = new FileReader(arquivo);
    BufferedReader br = new BufferedReader(fr);

    // Enquanto não atingir o final do arquivo continua lendo linha a linha (altere para ler várias vezes conforme sua necessidade)
    while((linha = br.readLine()) != null) {
        // Faz a separação das palavras em um Array de String conforme o separador informado, pode ser espaço, vírgula ou qualquer outra string
    	String[] texto = linha.split("separador");
    }

    fr.close();
    br.close();
} catch (Exception e) {
    e.printStackTrace();
}

O código acima é só um exemplo mas espero q ajude.

fabiocortolan, bom dia!

sua ajuda foi interessante mas a resposta não está perfeita.

o loop que preciso parece estar funcionando, o arquivo fica varrendo até eu determinar a parada, mas a resposta que esta saindo é essa:

Letras: [Ljava.lang.String;@1bcc0bc

Letras: [Ljava.lang.String;@10e790c

Letras: [Ljava.lang.String;@12d263f

Letras: [Ljava.lang.String;@134a7d8

Letras: [Ljava.lang.String;@1f78ef1

Letras: [Ljava.lang.String;@1c9a690

Abaixo, como está o meu código:

[code]public void run() { // método de execução de thread…
while (this.isInterrupted() == false) {
String codBinario = “”;
Simulador.txtArquivo.setText("");
try {
reader = new FileReader(filename);
leitor = new BufferedReader(reader);
while (leitor.ready()) {
while((codBinario = leitor.readLine()) != null) { // usei seu exemplo…
String[] texto = codBinario.split(" "); // caracter espaço é o separador que estou usando…
System.out.println("Letras: " + texto + " \n "); // apresentação no netbeans do resultado…
Simulador.txtArquivo.append(String.valueOf(texto) + " "); // apresentação no textArea do resultado separado por espaço (mesmos dados so println!)…
}
}
reader = new FileReader(filename);
leitor = new BufferedReader(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
leitor.close();
reader.close();

    } catch (IOException ex) {
        Logger.getLogger(LeArquivo.class.getName()).log(Level.SEVERE, null, ex);
    }
}[/code]

========================================================
o que estou fazendo de errado agora, alguém sabe me dizer???

Obrigado!

O problema está nessa linha. Quando você faz um toString() de um Array, dá nessa coisa feia ai.

System.out.println("Letras: " + texto + " \n "); // apresentação no netbeans do resultado...  

Você pode resolver com um toString() mais bonito:

System.out.println("Letras: " + Arrays.asList(texto).toString() + " \n "); // apresentação no netbeans do resultado...  

vc precisa especificar a posição do array q vc está lendo, por exemplo:

System.out.println("Letras: " + texto[0] + " \n "); // Resultado do array na posição '0'
System.out.println("Letras: " + texto[1] + " \n "); // Resultado do array na posição '1'

No seu caso, faça um laço para incluir o texto no "Simulador", segue abaixo:

while (leitor.ready())
  while((codBinario = leitor.readLine()) != null) {
      String[] texto = codBinario.split(" "); // atribui a linha separada para um Array
      
      // Laço para leitura do array, veja q a variável "texto" possui a posição que será lida "[i]"
      for (int i = 0; i < texto.length; i++) {
        System.out.println("Letras: " + texto[i] + " \n "); // apresenta o resultado do array na posição "i" 
        Simulador.txtArquivo.append(String.valueOf(texto[i]) + " ");
      }

      // Outra opção para o código acima seria com o "for aprimorado" ou "for each" (particularmente prefiro utilizar for aprimorado)
      for (String s : texto) {
        System.out.println("Letras: " + s + " \n "); // apresenta o resultado do array na posição "i" 
        Simulador.txtArquivo.append(String.valueOf(s) + " ");
      }
    }
}

Amigos, obrigado!

com vosso auxilio resolvi a questão…

Rafael Guerreiro, sua sugestão atende ao prósito, obrigado.

Mas a opção do fabiocortolan ficou mais apropriada à minha necessidade.

De qualquer forma agradeço a todos pela ajuda e contem comigo se precisarem de algo…(não sou expert mas to tentando chegar la…)

Grande abraço a todos.

Deixo abaixo o resultado final do meu “metodo” como auxílio aos que precisarem…

[code]public void run() {
while (this.isInterrupted() == false) {
String codBinario = “”;
Simulador.txtArquivo.setText("");
try {
reader = new FileReader(filename);
leitor = new BufferedReader(reader);

            //trecho de codigo sugerido pelo fabiocortolan no site do GUJ
            while (leitor.ready()) {
                while ((codBinario = leitor.readLine()) != null) {
                    String[] texto = codBinario.split(" "); // atribui a linha separada para um Array.
                    // Opção para o código com o "for aprimorado" ou "for each".
                    for (String s : texto) {
                        System.out.println("Letras: " + s); // apresenta o resultado do array.
                        Simulador.txtArquivo.append(String.valueOf(s) + " "); // exibe no textArea o resultado do array.
                    }
                }
            }
            
            reader = new FileReader(filename);
            leitor = new BufferedReader(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        leitor.close();
        reader.close();

    } catch (IOException ex) {
        Logger.getLogger(LeArquivo.class.getName()).log(Level.SEVERE, null, ex);
    }
}[/code]