Uso do ready() e readLine()

Olá, estou fazendo um programa em que eu leio linha por linha de um arquivo. Só que eu gostaria, antes de encerrar o programa, ler o arquivo novamente pelo inicio, só que quando utilizo o ready e chego no final do arquivo, não sei como fazer voltar para início.

...
while (leitor.ready()) {
                linha = leitor.readLine();
                //aqui faco algumas comparacoes
}
...

Resumindo, caso eu queria comecar tudo de novo, como faço? Sem precisar fechar o programa?

Olá

Bom, pelos métodos ready() e readLine(), imagino que leitor seja do tipo BufferedReader. Para retornar ao início do arquivo, você tem duas opções:

  1. Chamar o método close() do objeto e depois abrí-lo de novo; ou
  2. Assim que você abrir o objeto, antes de realizar qualquer leitura, chame o método mark() para marcar a posição inicial. Quando quiser retornar a esta posição, execute o método reset().

E a propósito, evite usar o método “ready”, embora saiba que muitos professores ensinem isso. Use algo como:

for (String linha = leitor.readLine(); linha != null; linha = leitor.readLine()) {
    // processe a linha lida
}

Ele não é um substituto perfeito para o “EOF” (indicação de final de arquivo) que existe em algumas linguagens que lidam com arquivos, como o Pascal (Delphi) ou o C++ (iostreams).

É que o “ready” na verdade indica se a leitura não vai bloquear quando você der um “readLine”.

Quando usado em sockets, por exemplo, isso não indica que o socket foi fechado, apenas que não há dados disponíveis no momento.

[quote=tnaires]Olá

Bom, pelos métodos ready() e readLine(), imagino que leitor seja do tipo BufferedReader. Para retornar ao início do arquivo, você tem duas opções:

  1. Chamar o método close() do objeto e depois abrí-lo de novo; ou
  2. Assim que você abrir o objeto, antes de realizar qualquer leitura, chame o método mark() para marcar a posição inicial. Quando quiser retornar a esta posição, execute o método reset().[/quote]

“mark”/“reset” é um pouco problemático - ele tende a bufferizar dados - uma hora, depois que você leu boa parte do BufferedReader, alguma coisa estoura; prefiro fechar o arquivo e abrir de novo, que é mais seguro e consome menos memória. Além disso, “mark”/“reset” nem sempre funcionam - é necessário checar sempre o método markSupported para ver se é possível usar mark/reset.

tnaires e entanglement,

Primeiro, a idéia do mark e do reset(depois de vários minutos para entender e das diversas tentativas) funcionou para o caso que estava fazendo.
Segundo, valeu pelo conselho de não usar o ready() e do mark e reset também, para as próximas implementação procurarei me atentar a esses detalhes.

VALEU MESMO!