EOFException - como resolver?

O arquivo que estou tentando ler tem esta ordem de tipos: String, String, Int, Int, Double e depois repete!

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.

1 curtida

Mas no código está lendo
String char char int double

1 curtida

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

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

1 curtida

A exceção ocorre justamente nessa linha!

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

Mas não imprime o “ds.available()” ?
Então acrescente um “catch”:

    } catch (EOFException ex) {
        // fim
    } catch (FileNotFoundException ex) {
        Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE, null, ex);
    } 

Isso deve sumir com a exceção, mas acho que não resolveria o problema

A exceção só ocorria com o código para teste que você sugeriu antes!

while (ds.available() > 0) {
System.out.println("ds.available() : "+ds.available());
String readData = ds.readUTF();
System.out.println("readData : "+readData);

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());
                    String readData = 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 (EOFException fim) {
                  ds.close();
                  break;
                }
            }

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

package com.gleisonmv.engine.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 
 * @author Gleison Morgado Vasconcelos
 *  
 */
public class FileUtil {

	/**
	 * Read context of file
	 * @param file
	 * 
	 * */
	public static String read(File file) 
	{
		// Current char
		int c = -1;
		// Build String
		StringBuilder sb = new StringBuilder();
		try 
		{
			// Read text from file
			BufferedReader br = new BufferedReader(new FileReader(file));
			// Read
			while((c = br.read()) != -1) 
			{
				// Append char in String
				sb.append((char) c);
			} 
			// Close the inputstream of file
			br.close();
			// Return the text
			return sb.toString();	
		} 
		catch (Exception e) 
		{
			// Error on read file
			e.printStackTrace(System.err);
		}
		// File error not has content
		return null;
	}
	
	public static void write(File file, String content) 
	{
		// Create the buffered writer
		try 
		{
			// Writer of file
			BufferedWriter bw = new BufferedWriter(new FileWriter(file));
			// Write the content
			bw.write(content);
			// Flush the writer content
			bw.flush();
			// Close the writer
			bw.close();	
		} 
		catch (IOException e) 
		{
			// Error on write the file
			e.printStackTrace(System.err);
		}		
	}
}
1 curtida

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! :persevere:

Se fosse você usaria a classe Scanner do java, com o fluxo de entrada do arquivo é mais seguro

Então significa que fica repetindo infinitamente IMPRIMINDO os dados e nunca termina ou termina e o programa trava?

Ele imprime todos os dados uma unica vez, mas o programa continua rodando! nunca finaliza a execução nem imprime mas nada!

Então coloca no final do método

System.out.println("Terminou leitura");

Isso quer dizer que o problema não é mais aí.

1 curtida

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

1 curtida

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.

   JFileChooser jfc = new JFileChooser();
    int returnVal = jfc.showOpenDialog(null);
    ClimaDoDia c = null;
    ArrayList<ClimaDoDia> objetos = new ArrayList<ClimaDoDia>();
    boolean cont = true;
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        FileInputStream fs = null;
        try {
            File file = jfc.getSelectedFile();
            fs = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fs);
            int dias = 0;
            int somachuva = 0;
            float ventomedio = 0;
            while (cont) {
                try {
                    c = (ClimaDoDia) ois.readObject();
                    if (c != null) {
                        objetos.add(c);
                    } else {
                        cont = false;
                    }
                } catch (EOFException fim) {
                    ois.close();
                    break;
                }
            }
            for (ClimaDoDia d : objetos) {
                dias++;
                somachuva += d.getIndicePluviometrico();
            }
            System.out.println(somachuva);
            System.out.println(dias);

E sem o catch da EOFException, ela é lançada logo após a primeira iteração

Aqui uma forma eficiente de resolver

  JFileChooser jfc = new JFileChooser();
  
  // Arquivo selecionado
  if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
    try {
 
        File file = jfc.getSelectedFile();
        
        FileInputStream fs = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fs);
        
  
        int dias = 0;
        int somachuva = 0;
        float ventomedio = 0;
        
        
        // Enquanto tiver bytes no fluxo de leitura
        while(ois.available() != 0) {
        	
        	Object obj = ois.readObject();
        	
        	// Verifica se é um objeto valido
        	if(obj != null && obj instanceof ClimaDoDia) {
        		
        		// Converte objeto primitivo na instancia da classe
        		ClimaDoDia d = (ClimaDoDia) obj;
        		
        		// Incrementa os dias
        		dias++;
        		
        		// soma a chuva
                somachuva += d.getIndicePluviometrico();
        	}
        
        }
      
        // Fecha a entrada de dados
        ois.close();

        // Debug
        System.out.println(somachuva);
        System.out.println(dias);
        
     } catch (Exception ex) {
    	 
    	 // Trata todas as exceções
       	ex.printStackTrace(System.err);
        break;
     }
}


``
1 curtida

Muito obrigado Gleison! Sanou todas as dúvidas.

:grin: :v: