Pergunta

Estou usando o trecho de código abaixo, mas não está funcionando como deveria.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Da leitura do Javadoc sobre readLine() diz:

Lê uma linha de texto.Uma linha é considerada encerrada por qualquer um dos feeds de linha (\n), um retorno de carro (\r) ou um retorno de carro seguido imediatamente por um avanço de linha.

Devoluções:A String contendo o conteúdo da linha, sem incluir caracteres de terminação de linha, ou nulo se o final do fluxo tiver sido alcançado

Lança: IOException - Se ocorrer um erro de E/S

Do meu entendimento disso, readLine deve retornar nulo na primeira vez que nenhuma entrada for inserida além de uma terminação de linha, como \r.No entanto, esse código acaba fazendo um loop infinito.Após a depuração, descobri que, em vez de ser retornado nulo quando apenas um caractere de terminação é inserido, ele na verdade retorna uma string vazia ("").Isso não faz sentido para mim.O que não estou entendendo corretamente?

Foi útil?

Solução

Pelo que entendi, readLine deve retornar nulo na primeira vez que nenhuma entrada for inserida além de uma terminação de linha, como '\ r'.

Isso não está correto. readLine retornará null se o final do fluxo for alcançado.Isto é, por exemplo, se você estiver lendo um arquivo e o arquivo terminar, ou se você estiver lendo de um soquete e o soquete fechar.

Mas se você estiver simplesmente lendo a entrada do console, pressionar a tecla Enter no teclado não constitui o fim do fluxo.É simplesmente um caractere que é retornado (\n ou \r\n dependendo do seu sistema operacional).

Então, se você quiser quebrar a string vazia e o final da linha, você deve fazer:

while (line != null && !line.equals(""))

Além disso, seu programa atual deverá funcionar conforme o esperado se você canalizar algum arquivo diretamente para ele, assim:

java -cp . Echo < test.txt

Outras dicas

Nenhuma entrada não é igual ao final do fluxo.Geralmente você pode simular o final do stream em um console pressionando Ctrl+D (AFAIK alguns sistemas usam Ctrl+Z em vez de).Mas acho que não é isso que você deseja, então é melhor testar strings vazias além de strings nulas.

Há um bom linguagem comum apache biblioteca que possui uma boa API para ações comuns :).Você poderia usar import estaticamente StringUtils e usar seu método isNotEmpty(String ) para obter:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

Pode ser útil algum dia :) Existem também outras classes úteis nesta biblioteca.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top