Duvida a respeito do mark() e do reset()

6 respostas
D

Olá!

Estou utilizando o BufferedReader para ler dados em um arquivo texto. Na minha classe, vários metodos necessitam ter acesso a esse arquivo texto, então, declarei o buffered como atributo da classe…

Consigo utilizalo normalmente conforme vou dando o readLine(), porém, quando OUTRO METODO for acessar esse bReader, o ponteiro está lá embaixo… e nao consigo ler desde o começo.

Como resolver!?

o mark e o reset dão erro =/

Obrigado

6 Respostas

T

du123:
Olá!

Estou utilizando o BufferedReader para ler dados em um arquivo texto. Na minha classe, vários metodos necessitam ter acesso a esse arquivo texto, então, declarei o buffered como atributo da classe…


Se eu disser que isso não é aconselhável, você não fica bravo?


Consigo utilizalo normalmente conforme vou dando o readLine(), porém, quando OUTRO METODO for acessar esse bReader, o ponteiro está lá embaixo… e nao consigo ler desde o começo.

Como resolver!?

o mark e o reset dão erro =/

Obrigado


Que tipo de erro eles dão? Que eu saiba, mark() e reset() funcionam muito bem se o arquivo não for muito grande (é que “mark” marca uma posição no arquivo, mas copia os dados para a memória desde essa posição até a posição lida. Ou seja: se seu arquivo-texto tiver 20 MB, e você marcar a posição 1.000.000, então você vai ter de acumular 19 MB na memória :frowning:

D

Obrigado pela resposta thingol! =)

Qual seria o ideal, cara? Declarar em cada método um bReader?

java.io.IOException: Mark invalid

at java.io.BufferedReader.reset(Unknown Source)

at PCCapital.UpBase(PCCapital.java:98)

at PCCapital.(PCCapital.java:39)

at IndexPC.main(IndexPC.java:7)

Exception in thread main

Esse é o erro gerado pelo reset() … independente de onde eu ponha o mark()…

Obrigado novamente!

T

Deixa eu ver. Acho que dá para definir vários “readers” se o arquivo for aberto apenas para leitura, mas vou confirmar isto agora.

D

Isso dá para fazer
na primeira vez q fiz esse programinha aqui eu fiz desse jeito
mas achei meio bobera… pq tava declarando trocentas vezes a msm coisa

D

Para quem interessar…

A melhor solução para esse problema, no meu caso, foi pegar o arquivo texto, dar um load dele inteirinho em uma arraylist, e trabalhar apartir de lá…

T
import java.io.*;
import java.util.zip.*;

class SeveralReaders implements Runnable {
    // Cada thread irá ler o arquivo do começo ao fim, e irá ao fim dizer quantas linhas leu
    // e imprimir um "checksum" para indicar se leu tudo corretamente.
    
    private String filename;
    
    // cria um arquivo com 100000 linhas.
    public void setup() {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter (new FileWriter (filename));
            for (int i = 0; i &lt 100000; ++i) {
                bw.write ("abcdefghijklmnopqrstuvwyz ABCDEFGHIJKLMNOPQRSTUVWYZ");
                bw.newLine();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (bw != null)
                try { bw.close(); } catch (IOException ex) {}
        }
    }
    
    public void run() {
        // note que como LineNumberReader já é um BufferedReader eu não precisaria
        // encapsulá-lo dentro de um BufferedReader. Mas você pode eliminar
        // o LineNumberReader e CheckedInputStream se quiser - só estou
        // mostrando como usar essas classes.
        BufferedReader br = null;
        LineNumberReader lnr = null;
        CheckedInputStream cis = null;
        Checksum csum = new CRC32();
        String linha;
        try {
            br = new BufferedReader (
                lnr = new LineNumberReader (
                new InputStreamReader (
                cis = new CheckedInputStream (
                new FileInputStream (filename), csum))));
            while ((linha = br.readLine()) != null) {
                ; // só estou lendo 
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (br != null)
                try { br.close(); } catch (IOException ex) {}
        }
        System.out.println ("Lidas " + lnr.getLineNumber() + " linhas; checksum = " + cis.getChecksum().getValue());
    }

    public void test (String filename, int nReaders) {
        this.filename = filename;
        System.out.println ("Gerando arquivo de teste...");
        setup ();
        Thread[] thr = new Thread[nReaders];
        System.out.println ("Iniciando os readers...");
        for (int i = 0; i &lt nReaders; ++i) {
             thr[i] = new Thread(this);
             thr[i].start();
        }
        System.out.println ("Esperando os readers...");
        for (int i = 0; i &lt nReaders; ++i) {
             try { thr[i].join(); } catch (InterruptedException ex) {}
        }
        System.out.println ("Fim.");
    }
    public static void main(String[] args) {
        SeveralReaders sr = new SeveralReaders();
        sr.test ("file.txt", 5);
    }
}
Criado 29 de novembro de 2006
Ultima resposta 29 de nov. de 2006
Respostas 6
Participantes 2