Java não tem seek() para linhas de Arquivo?

4 respostas
ricardo13

olá pessoal,

estou fazendo um experimento com um arquivo que contenha mais de 150000 linhas.

Pois estou querendo ler uma linha aleatóriamente, eu tentei com o RandomAcessFile.seek(), mas eu percebi que o posicionamento do ponteiro era dentro da linha.

Eu to kerendo, de forma aleatória escolher uma linha e ler a linha inteira … lembrando que o tamanho da linha é variável.

Muito Obrigado

Ricardo

4 Respostas

B

Poderia gerar um número aleatório de 0 até o número de linhas do arquivo com o Random, e percorrer o arquivo até essa linha escolhida com o LineNumberReader.

ricardo13

olá,

Obrigado pela resposta.

Mas o arquivo tem muitos registros (linhas) … percorrer todo o arquivo até chegar na linha selecionanda vai despender muito tempo, não vai ???

Bom…vou dar uma olhada nessa classe (LineNumberReader) …nunca tinha ouvido falar nela.

Por acaso, se você puder passar o código de como faz esse tipo de coisa, também pq nunca usei essa classe.

Eu agradeceria

Mais uma vez obrigado

Ricardo

ricardo13

vou mandar o exemplo q eu fiz com LineNumberReader, mas ele ta lendo somente a 1º linha.

try {            
            LineNumberReader lnr = new LineNumberReader(
                    new FileReader(
                    new File("/home/usuariox/static_audio")));
            
            Double d = Math.random() * 100;
            int pos = d.intValue();
            
            lnr.setLineNumber(pos);
                        
            String line = lnr.readLine();
            System.out.println("URL: " +line);
            
            lnr.close();
            
        } catch(FileNotFoundException e) { 
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }

Eu encontrei alguma coisa assim na net … falando que o método setLineNumber poderia fazer isso … ,mas pelo jeito não ta selecionando a linha.

Obrigado
Ricardo

B

Não, não vai, a menos que você percorra o arquivo muitas vezes. Neste caso, gere todos os números aleatórios que você for precisar, e percorra o arquivo uma vez, coletando tudo.

Tente o seguinte:

LineNumberReader reader = new LineNumberReader(new FileReader("nome Do arquivo")));
final int QTDE_ALEATORIOS = 10;
int i = 0;

SortedSet<Integer> numeros = gerarNumerosAleatorios(QTDE_ALEATORIOS);
List<String> linhas = new ArrayList<String>(numeros.size());

String linha = null;
while ((linha = reader.readLine()) != null || i < QTDE_ALEATORIOS)
{
  if (numeros.contains(reader.getLineNumber())){
    linhas.add(linha);
    i++;
  }
}

return linhas;
Criado 29 de novembro de 2008
Ultima resposta 30 de nov. de 2008
Respostas 4
Participantes 2