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.
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 ).
Em particular acho mais fácil usar STAX que SAX.
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.