GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Quantidade de linhas de um arquivo


#1

Olá,

Existe alguma maneira no Java de saber a quantidade de linhas que um arquivo tem?
E existe alguma forma de ir diretamente para determinada linha?

Tenho um arquivo de 700 mil linhas (em média) e preciso fazer validação na última linha antes de começar a validar as linhas anteriores.
Se fizer isso de forma sequencial fica muito custoso.

Obrigada


#2

se vc fala de um arquivo texto crú, o único jeito que eu conheço é percorrer todo o arquivo contando os '\n'


#3

Se o arquivo tiver todas as linhas de um mesmo tamanho (por exemplo, um arquivo CNAB, onde normalmente só a primeira linha tem comprimento diferente das demais), então você consegue ir diretamente para um determinado ponto do arquivo usando RandomAccessFile (não FileReader, que tem de ler o arquivo seqüencialmente).

Se as linhas forem de comprimento diferente, então você teria de ler seqüencialmente mesmo, ou talvez criar um segundo arquivo (diria um "arquivo de índice") indicando onde está o início de cada linha. Esse arquivo obviamente teria de ser criado lendo-se seqüencialmente o arquivo original uma vez, mas depois disso você poderia usá-lo para saber onde ir.

Se o arquivo tem 700.000 linhas mas está em formato XML, o problema é só um "pouquinho" pior. Nesse caso, eu recomendaria o uso de SAX ou STAX (não é aquele salgadinho parecido com o Pringles não :stuck_out_tongue: ).
Em particular acho mais fácil usar STAX que SAX.


#4

Se o seu problema for "ler a última linha" dá para fazer isso usando uma gambiarra bastante grande. Abra o arquivo com RandomAccessFile e và lendo o arquivo byte por byte, de trás para frente, até encontrar um caracter "\n" (o byte 0x10). Isso quer dizer que você achou a última linha. (Pode ser que você já o encontre logo de cara, porque a última linha foi terminada com "\n". Se for esse o caso, então ache o segundo "\n". Quando você achar o segundo "\n", você terá lido apenas e tão somente a última linha. É meio nojento mas deve funcionar.
Não esqueça de ir acumulando os bytes que você leu, é claro.


#5

Vou pesquisar sobre essa classe.

Obrigada pela ajuda!

:smile:


#6

Loiane

Sei que esse tópico é antigo, mas vou responder essa dúvida para aqueles que tiverem o mesmo problema futuramente e passarem por aqui.

File arquivoLeitura = new File("Arquivo.txt");
LineNumberReader linhaLeitura = new LineNumberReader(new FileReader(arquivoLeitura));
linhaLeitura.skip(arquivoLeitura.length());
int qtdLinha = linhaLeitura.getLineNumber();

[]s


#7

gmmascarin,

se te serve de consolo.

Obrigado por responder o post da Loiane, mesmo sendo antigo me ajudou!! rs


#8