Bom dia! Fiz um programa pra faculdade e estou tendo um problema com EOFException. sei que este ocorre quando o fim do arquivo é atingido inesperadamente, mas não sei como resolver neste caso! segue o código: (A exceção ocorre na linha após o while, readData = ds.readUTF()
JFileChooserjfc=newJFileChooser();intreturnval=jfc.showOpenDialog(null);intlido=0;intultimomes=-1;if(returnval==JFileChooser.APPROVE_OPTION){Filefile=jfc.getSelectedFile();try{FileInputStreamfs=newFileInputStream(file);BufferedInputStreambs=newBufferedInputStream(fs);DataInputStreamds=newDataInputStream(bs);BufferedReaderbr=newBufferedReader(newInputStreamReader(fs));while(lido!=-1){StringreadData=ds.readUTF();Stringsaidavento=Character.toString(ds.readChar())+Character.toString(ds.readChar());SimpleDateFormatsdf=newSimpleDateFormat("dd/MM/yyyy");intvelocidadevento=ds.readInt();intpluviometro=ds.readInt();doubletemperatura=ds.readDouble();Datedate=sdf.parse(readData);Calendarcal=Calendar.getInstance();cal.setTime(date);ClimaDoDiaclima=newClimaDoDia(date,saidavento,velocidadevento,pluviometro,temperatura);FileOutputStreamprimeiro=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");if(cal.get(Calendar.MONTH)!=ultimomes){FileOutputStreamproximo=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");ObjectOutputStreamgravar=newObjectOutputStream(proximo);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}else{ObjectOutputStreamgravar=newObjectOutputStream(primeiro);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}lido=ds.read();}}catch(FileNotFoundExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(IOExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(ParseExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}}else{JOptionPane.showMessageDialog(null,"Usuário cancelou a operação!");}}
Sua sugestão resolveu aquele problema! mas agora estou com outro em mãos!
Agora parece que a exceção nunca é lançada, e o loop fica infinito!
Segue o código alterado:
JFileChooserjfc=newJFileChooser();intreturnval=jfc.showOpenDialog(null);intultimomes=-1;if(returnval==JFileChooser.APPROVE_OPTION){Filefile=jfc.getSelectedFile();try{FileInputStreamfs=newFileInputStream(file);BufferedInputStreambs=newBufferedInputStream(fs);DataInputStreamds=newDataInputStream(bs);BufferedReaderbr=newBufferedReader(newInputStreamReader(fs));while(true){try{StringreadData=ds.readUTF();Stringsaidavento=Character.toString(ds.readChar())+Character.toString(ds.readChar());SimpleDateFormatsdf=newSimpleDateFormat("dd/MM/yyyy");intvelocidadevento=ds.readInt();intpluviometro=ds.readInt();doubletemperatura=ds.readDouble();Datedate=sdf.parse(readData);Calendarcal=Calendar.getInstance();cal.setTime(date);ClimaDoDiaclima=newClimaDoDia(date,saidavento,velocidadevento,pluviometro,temperatura);FileOutputStreamprimeiro=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");if(cal.get(Calendar.MONTH)!=ultimomes){FileOutputStreamproximo=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");ObjectOutputStreamgravar=newObjectOutputStream(proximo);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}else{ObjectOutputStreamgravar=newObjectOutputStream(primeiro);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}}catch(EOFExceptionfim){ds.close();break;}}}catch(FileNotFoundExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(IOExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(ParseExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}}else{JOptionPane.showMessageDialog(null,"Usuário cancelou a operação!");}}
Fiz as alterações, mas o loop continua infinito!
Não sei o que fazer!
JFileChooserjfc=newJFileChooser();intreturnval=jfc.showOpenDialog(null);intultimomes=-1;intlido=0;if(returnval==JFileChooser.APPROVE_OPTION){Filefile=jfc.getSelectedFile();try{FileInputStreamfs=newFileInputStream(file);BufferedInputStreambs=newBufferedInputStream(fs);DataInputStreamds=newDataInputStream(bs);BufferedReaderbr=newBufferedReader(newInputStreamReader(fs));while(lido!=-1){while(ds.available()>0){StringreadData=ds.readUTF();Stringsaidavento=Character.toString(ds.readChar())+Character.toString(ds.readChar());SimpleDateFormatsdf=newSimpleDateFormat("dd/MM/yyyy");intvelocidadevento=ds.readInt();intpluviometro=ds.readInt();doubletemperatura=ds.readDouble();Datedate=sdf.parse(readData);Calendarcal=Calendar.getInstance();cal.setTime(date);ClimaDoDiaclima=newClimaDoDia(date,saidavento,velocidadevento,pluviometro,temperatura);FileOutputStreamprimeiro=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");if(cal.get(Calendar.MONTH)!=ultimomes){FileOutputStreamproximo=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");ObjectOutputStreamgravar=newObjectOutputStream(proximo);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}else{ObjectOutputStreamgravar=newObjectOutputStream(primeiro);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}}lido=ds.read();}}catch(FileNotFoundExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(IOExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(ParseExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}}else{JOptionPane.showMessageDialog(null,"Usuário cancelou a operação!");}}privatevoidbtRelatorioActionPerformed(java.awt.event.ActionEventevt){JFileChooserjfc=newJFileChooser();intreturnVal=jfc.showOpenDialog(null);if(returnVal==JFileChooser.APPROVE_OPTION){FileInputStreamfs=null;try{Filefile=jfc.getSelectedFile();fs=newFileInputStream(file);BufferedInputStreambs=newBufferedInputStream(fs);DataInputStreamds=newDataInputStream(bs);}catch(FileNotFoundExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(IOExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}finally{try{fs.close();}catch(IOExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}}}else{JOptionPane.showMessageDialog(null,"O usuário cancelou a operação!");}
D
diego121 like
remova essas linhas
H
heitorsilveira
Removi e continua infinito! poderia ser alguma particularidade do arquivo que estou tentando ler talvez?
privatevoidbtLerActionPerformed(java.awt.event.ActionEventevt){JFileChooserjfc=newJFileChooser();intreturnval=jfc.showOpenDialog(null);intultimomes=-1;intlido=0;if(returnval==JFileChooser.APPROVE_OPTION){Filefile=jfc.getSelectedFile();try{FileInputStreamfs=newFileInputStream(file);BufferedInputStreambs=newBufferedInputStream(fs);DataInputStreamds=newDataInputStream(bs);BufferedReaderbr=newBufferedReader(newInputStreamReader(fs));while(ds.available()>0){StringreadData=ds.readUTF();Stringsaidavento=Character.toString(ds.readChar())+Character.toString(ds.readChar());SimpleDateFormatsdf=newSimpleDateFormat("dd/MM/yyyy");intvelocidadevento=ds.readInt();intpluviometro=ds.readInt();doubletemperatura=ds.readDouble();Datedate=sdf.parse(readData);Calendarcal=Calendar.getInstance();cal.setTime(date);ClimaDoDiaclima=newClimaDoDia(date,saidavento,velocidadevento,pluviometro,temperatura);FileOutputStreamprimeiro=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");if(cal.get(Calendar.MONTH)!=ultimomes){FileOutputStreamproximo=newFileOutputStream(cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+".dat");ObjectOutputStreamgravar=newObjectOutputStream(proximo);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}else{ObjectOutputStreamgravar=newObjectOutputStream(primeiro);gravar.writeObject(clima);gravar.flush();gravar.close();ultimomes=cal.get(Calendar.MONTH);}}}catch(FileNotFoundExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(IOExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}catch(ParseExceptionex){Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE,null,ex);}}else{JOptionPane.showMessageDialog(null,"Usuário cancelou a operação!");}}
Esta é a saída! porém logo após ocorre uma EOFException! ds.available() : 459
readData : 4/1/2018 ds.available() : 449
readData : ds.available() : 369
readData : 7/1/2018 ds.available() : 359 @1ffffff8/1/2018
H
heitorsilveira
O arquivo que estou tentando ler tem esta ordem de tipos: String, String, Int, Int, Double e depois repete!
D
diego121 like
Provavelmente está lendo errado, para cada ds.read* crie um System.out.println para identificar o que está errado. Não tenho como verificar aqui.
D
diego121 like
Mas no código está lendo
String char char int double
H
heitorsilveira
Aparentemente está lendo tudo corretamente! São dados de diversos dias, por isso são tantos.
Saída: ds.available() : 459
readData : 4/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 20
Pluviometro: 0
Temperatura: 27.0 ds.available() : 429
readData : 5/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 58
Pluviometro: 14
Temperatura: 25.2 ds.available() : 399
readData : 6/1/2018
Direção do vento (char + char): E
Velocidade do vento: 65
Pluviometro: 5
Temperatura: 18.2 ds.available() : 369
readData : 7/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 50
Pluviometro: 13
Temperatura: 17.4 ds.available() : 339
readData : 8/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 17
Pluviometro: 6
Temperatura: 23.0 ds.available() : 309
readData : 9/1/2018
Direção do vento (char + char): W
Velocidade do vento: 64
Pluviometro: 0
Temperatura: 21.0 ds.available() : 279
readData : 10/1/2018
Direção do vento (char + char): E
Velocidade do vento: 27
Pluviometro: 9
Temperatura: 24.6 ds.available() : 248
readData : 11/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 36
Pluviometro: 2
Temperatura: 17.7 ds.available() : 217
readData : 12/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 48
Pluviometro: 18
Temperatura: 22.1 ds.available() : 186
readData : 13/1/2018
Direção do vento (char + char): W
Velocidade do vento: 65
Pluviometro: 1
Temperatura: 17.4 ds.available() : 155
readData : 14/1/2018
Direção do vento (char + char): E
Velocidade do vento: 35
Pluviometro: 4
Temperatura: 22.8 ds.available() : 124
readData : 15/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 12
Pluviometro: 17
Temperatura: 23.0 ds.available() : 93
readData : 16/1/2018
Direção do vento (char + char): W
Velocidade do vento: 37
Pluviometro: 0
Temperatura: 23.6 ds.available() : 62
readData : 17/1/2018
Direção do vento (char + char): NW
Velocidade do vento: 22
Pluviometro: 4
Temperatura: 23.1 ds.available() : 31
readData : 18/1/2018
Direção do vento (char + char): E
Velocidade do vento: 14
Pluviometro: 0
Temperatura: 27.3
D
diego121 like
Onde está ocorrendo a exceção?
Se for na “String readData = ds.readUTF();” seria impossível imprimir esse resultado pois antes dessa linha tem "System.out.println("ds.available() : “+ds.available());”
Então o final seria:
ds.available() : 31
readData : 18/1/2018
Direção do vento (char + char): E
Velocidade do vento: 14
Pluviometro: 0
Temperatura: 27.3 ds.available() : ?? <-- faltou essa linha
H
heitorsilveira
A exceção ocorre justamente nessa linha!
H
heitorsilveira
pelo que parece o programa nunca termina de ler o arquivo, porém pelo teste que fizemos antes, ele imprime todo o conteúdo do mesmo!
ds.available() : 459
readData : 4/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 20
Pluviometro: 0
Temperatura: 27.0 ds.available() : 429
readData : 5/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 58
Pluviometro: 14
Temperatura: 25.2 ds.available() : 399
readData : 6/1/2018
Direção do vento (char + char): E
Velocidade do vento: 65
Pluviometro: 5
Temperatura: 18.2 ds.available() : 369
readData : 7/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 50
Pluviometro: 13
Temperatura: 17.4 ds.available() : 339
readData : 8/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 17
Pluviometro: 6
Temperatura: 23.0 ds.available() : 309
readData : 9/1/2018
Direção do vento (char + char): W
Velocidade do vento: 64
Pluviometro: 0
Temperatura: 21.0 ds.available() : 279
readData : 10/1/2018
Direção do vento (char + char): E
Velocidade do vento: 27
Pluviometro: 9
Temperatura: 24.6 ds.available() : 248
readData : 11/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 36
Pluviometro: 2
Temperatura: 17.7 ds.available() : 217
readData : 12/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 48
Pluviometro: 18
Temperatura: 22.1 ds.available() : 186
readData : 13/1/2018
Direção do vento (char + char): W
Velocidade do vento: 65
Pluviometro: 1
Temperatura: 17.4 ds.available() : 155
readData : 14/1/2018
Direção do vento (char + char): E
Velocidade do vento: 35
Pluviometro: 4
Temperatura: 22.8 ds.available() : 124
readData : 15/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 12
Pluviometro: 17
Temperatura: 23.0 ds.available() : 93
readData : 16/1/2018
Direção do vento (char + char): W
Velocidade do vento: 37
Pluviometro: 0
Temperatura: 23.6 ds.available() : 62
readData : 17/1/2018
Direção do vento (char + char): NW
Velocidade do vento: 22
Pluviometro: 4
Temperatura: 23.1 ds.available() : 31
readData : 18/1/2018
Direção do vento (char + char): E
Velocidade do vento: 14
Pluviometro: 0
Temperatura: 27.3
D
diego12
Mas não imprime o “ds.available()” ?
Então acrescente um “catch”:
Porém, quando fiz o código para imprimir todos os dados, não ocorre a exceção, somente fica no loop infinito!
while(ds.available()>0){try{System.out.println("ds.available() : "+ds.available());StringreadData=ds.readUTF();System.out.println("readData : "+readData);System.out.println("Direção do vento (char + char): "+Character.toString(ds.readChar())+Character.toString(ds.readChar()));System.out.println("Velocidade do vento: "+ds.readInt());System.out.println("Pluviometro: "+ds.readInt());System.out.println("Temperatura: "+ds.readDouble());}catch(EOFExceptionfim){ds.close();break;}}
G
Gleison_M_v1 like
Para que complicar tanto, pode usar essa minha classe como base para seu projeto
Esse é um dos melhores jeito de se escrever um arquivo e ler
packagecom.gleisonmv.engine.util;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;/** * * @author Gleison Morgado Vasconcelos * */publicclassFileUtil{/** * Read context of file * @param file * * */publicstaticStringread(Filefile){// Current charintc=-1;// Build StringStringBuildersb=newStringBuilder();try{// Read text from fileBufferedReaderbr=newBufferedReader(newFileReader(file));// Readwhile((c=br.read())!=-1){// Append char in Stringsb.append((char)c);}// Close the inputstream of filebr.close();// Return the textreturnsb.toString();}catch(Exceptione){// Error on read filee.printStackTrace(System.err);}// File error not has contentreturnnull;}publicstaticvoidwrite(Filefile,Stringcontent){// Create the buffered writertry{// Writer of fileBufferedWriterbw=newBufferedWriter(newFileWriter(file));// Write the contentbw.write(content);// Flush the writer contentbw.flush();// Close the writerbw.close();}catch(IOExceptione){// Error on write the filee.printStackTrace(System.err);}}}
H
heitorsilveira
Cara, agradeço de verdade por isso! mas como é um trabalho pra faculdade, eu provavelmente teria problemas com o professor caso usasse uma classe pra fazer essa leitura! Hahahahaha
mas obrigado de qualquer forma!
Por acaso você não teria nenhum palpite do que poderia estar ocasionando esse loop infinito? é só esse problema que me impede de terminar o trabalho!
G
Gleison_M_v
Se fosse você usaria a classe Scanner do java, com o fluxo de entrada do arquivo é mais seguro
D
diego12
Então significa que fica repetindo infinitamente IMPRIMINDO os dados e nunca termina ou termina e o programa trava?
H
heitorsilveira
Ele imprime todos os dados uma unica vez, mas o programa continua rodando! nunca finaliza a execução nem imprime mas nada!
D
diego121 like
Então coloca no final do método
System.out.println("Terminou leitura");
Isso quer dizer que o problema não é mais aí.
G
Gleison_M_v1 like
Se não quiser, pode tentar colocar isso no fim do loop, se ele for -1 na leitura, no lugar de lido = ds.read();
if(ds.available()==0||(lido=ds.read())==-1)break;
Fiz a correção, Se no fim da ultima leitura, não existir outra o break para o while e continua a execução do bloco de código
H
heitorsilveira
Solucionado! Obrigado pela ajuda!
Se ainda estiverem dispostos a ajudar, me deparei com outra questão agora:
Preciso ler um arquivo binário que contém n objetos serializados dentro do mesmo, e preciso somar os atributos que cada um deles tem para obter médias e etc.
Qual seria a melhor forma de fazer essa leitura?
Segue o código que tentei usar, mas pelo que parece ele só itera uma vez antes de encerrar.
E sem o catch da EOFException, ela é lançada logo após a primeira iteração
G
Solucao aceita
Gleison_M_v1 like
Aqui uma forma eficiente de resolver
JFileChooserjfc=newJFileChooser();// Arquivo selecionadoif(jfc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION){try{Filefile=jfc.getSelectedFile();FileInputStreamfs=newFileInputStream(file);ObjectInputStreamois=newObjectInputStream(fs);intdias=0;intsomachuva=0;floatventomedio=0;// Enquanto tiver bytes no fluxo de leiturawhile(ois.available()!=0){Objectobj=ois.readObject();// Verifica se é um objeto validoif(obj!=null&&objinstanceofClimaDoDia){// Converte objeto primitivo na instancia da classeClimaDoDiad=(ClimaDoDia)obj;// Incrementa os diasdias++;// soma a chuvasomachuva+=d.getIndicePluviometrico();}}// Fecha a entrada de dadosois.close();// DebugSystem.out.println(somachuva);System.out.println(dias);}catch(Exceptionex){// Trata todas as exceçõesex.printStackTrace(System.err);break;}}``