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.
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
D
du123
Obrigado pela resposta thingol! =)
Qual seria o ideal, cara? Declarar em cada método um bReader?
Esse é o erro gerado pelo reset() … independente de onde eu ponha o mark()…
Obrigado novamente!
T
thingol
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
du123
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
du123
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
thingol
importjava.io.*;importjava.util.zip.*;classSeveralReadersimplementsRunnable{// 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.privateStringfilename;// cria um arquivo com 100000 linhas.publicvoidsetup(){BufferedWriterbw=null;try{bw=newBufferedWriter(newFileWriter(filename));for(inti=0;i<100000;++i){bw.write("abcdefghijklmnopqrstuvwyz ABCDEFGHIJKLMNOPQRSTUVWYZ");bw.newLine();}}catch(IOExceptionex){ex.printStackTrace();}finally{if(bw!=null)try{bw.close();}catch(IOExceptionex){}}}publicvoidrun(){// 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.BufferedReaderbr=null;LineNumberReaderlnr=null;CheckedInputStreamcis=null;Checksumcsum=newCRC32();Stringlinha;try{br=newBufferedReader(lnr=newLineNumberReader(newInputStreamReader(cis=newCheckedInputStream(newFileInputStream(filename),csum))));while((linha=br.readLine())!=null){;// só estou lendo }}catch(IOExceptionex){ex.printStackTrace();}finally{if(br!=null)try{br.close();}catch(IOExceptionex){}}System.out.println("Lidas "+lnr.getLineNumber()+" linhas; checksum = "+cis.getChecksum().getValue());}publicvoidtest(Stringfilename,intnReaders){this.filename=filename;System.out.println("Gerando arquivo de teste...");setup();Thread[]thr=newThread[nReaders];System.out.println("Iniciando os readers...");for(inti=0;i<nReaders;++i){thr[i]=newThread(this);thr[i].start();}System.out.println("Esperando os readers...");for(inti=0;i<nReaders;++i){try{thr[i].join();}catch(InterruptedExceptionex){}}System.out.println("Fim.");}publicstaticvoidmain(String[]args){SeveralReaderssr=newSeveralReaders();sr.test("file.txt",5);}}