EOFException - como resolver?

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: