Qual é a melhor maneira de ler um arquivo de texto de duas linhas em um momento em Java?

StackOverflow https://stackoverflow.com/questions/455695

  •  19-08-2019
  •  | 
  •  

Pergunta

BufferedReader in;

String line;
while ((line = in.readLine() != null) {
    processor.doStuffWith(line);
}

Isto é como eu iria processar um arquivo linha por linha. Neste caso, no entanto, eu quero enviar dois linhas de texto para o processador em cada iteração. (O arquivo de texto que eu estou processando essencialmente armazena um registro em duas linhas, por isso estou enviando um único registro para o processador de cada vez.)

Qual é a melhor maneira de fazer isso em Java?

Foi útil?

Solução

Por que não apenas ler duas linhas?

BufferedReader in;
String line;
while ((line = in.readLine() != null) {
    processor.doStuffWith(line, in.readLine());
}

Isso pressupõe que você pode confiar em ter completos conjuntos de dados de 2 linhas em seu arquivo de entrada.

Outras dicas

BufferedReader in;
String line1, line2;

while((line1 = in.readLine()) != null 
   && (line2 = in.readLine()) != null))
{
    processor.doStuffWith(line1, line2);
}

Ou você poderia concatenar-los se você queria.

Eu refatorar código para olhar alguma forma parecido com isto:

RecordReader recordReader;
Processor processor;

public void processRecords() {
    Record record;

    while ((record = recordReader.readRecord()) != null) {
        processor.processRecord(record);
    }
}

É claro que, nesse caso, você tem que de alguma forma injetar leitor registro correto para esta classe, mas isso não deve ser um problema.

Uma implementação do RecordReader poderia ser assim:

class BufferedRecordReader implements RecordReader
{
    BufferedReader in = null;

    BufferedRecordReader(BufferedReader in)
    {
        this.in = in;
    }
    public Record readRecord()
    {
        String line = in.readLine();

        if (line == null) {
            return null;
        }

        Record r = new Record(line, in.readLine());

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