EOF Exception

lilcrazy

Power Member
Boas pessoal.
Eu estou com um problema com a seguinte excepção: java.io.EOFException
Estou a fazer um programa para uma loja de video, e tenho uma classe ficheiro que tem vários métodos, um dos quais é: lerFicheiroObjectos(int tipo, Vector v) -> o tipo indica qual o ficheiro a ler e o objectivo é ler linha a linha do ficheiro de objectos e ir escrevendo num vector que no final é retornado. O programa funciona todo bem e nem da para notar nos erros sem ser na consola do netbeans.

Lista de erros da exepção:

PHP:
java.io.EOFException
       at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        at clubevideo.Ficheiro.leFicheiroObjectos(Ficheiro.java:474)
        at clubevideo.GestaoSistema.getListaVideos(GestaoSistema.java:88)
        at clubevideo.visualizaStockGUI.cb_escolhaActionPerformed(visualizaStockGUI.java:197)
        at clubevideo.visualizaStockGUI.access$000(visualizaStockGUI.java:17)
        at clubevideo.visualizaStockGUI$1.actionPerformed(visualizaStockGUI.java:66)
        at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1242)
        at javax.swing.JComboBox.setSelectedItem(JComboBox.java:569)
        at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:605)
        at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:814)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:480)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
ObjectOutputStream não foi aberto.


A parte de código é a seguinte:


Código:
// -- lê objectos dos ficheiros e coloca-os num Vector que é retornado
 public static Vector leFicheiroObjectos(int type) throws IOException, ClassNotFoundException{

  ObjectInputStream ois = null;   
     
  (...)
  else if(type == 7){
    fileName = "Videos.dat";
    Vector<Video> videos = new Vector<Video>();

    try{
     ois = new ObjectInputStream(new FileInputStream(fileName));   

     Video v = (Video) ois.readObject();
     
     while(v != null){
      videos.addElement(v);
      v = (Video) ois.readObject();
     }

    }catch(Exception e){
     e.printStackTrace();
    }finally{
      try{
       if (ois == null){ 
        System.out.println("Chegou ao final da escrita do ficheiro.");
        ois.close();
       }else{ 
         System.out.println("ObjectOutputStream não foi aberto.");
        }
       }catch(IOException e){
         System.out.println("Não foi possível fechar o ObjectOutputStream.");
        } 
      } 
    
    vect_retornado = videos;  
  }

 (...)
}

Numa das linhas de erro, aponta para:

Código:
v = (Video) ois.readObject();


Repito: corre tudo bem, acho que está a acontecer alguma coisa a ler ou a escrever do/no final do ficheiro de objectos.

Alguém me poderia ajudar?

Obrigado
 
se tu estas a gravar um objecto num ficheiro, ao ler tu vais estar unicamente a ler o objecto ou a estrutura de dados q guardaste. Teria mais sentido estares a ler linha a linha de um ficheiro de texto.

ou seja, tu ao guardares a info ou guardas o vector ou outra estrutura de dados onde tens os dados todos, e depois vais ler esse objecto e poes para dentro do vector, ou simplesmente guardas um objecto de uma classe.

esta é a classe q me acompanha nos trabs das aulas para ler fich de objectos

Código:
import java.io.*;

class FicheiroObjectos {

    private ObjectInputStream iS;
    private ObjectOutputStream oS;

    public void abreLeitura(String nomeDoFicheiro) throws IOException{

        try{
            iS = new ObjectInputStream(new FileInputStream(nomeDoFicheiro));
        }
        catch(IOException e){
            System.out.println(e);
        }
    }

    public void abreEscrita(String nomeDoFicheiro) throws IOException{
        try{
            oS = new ObjectOutputStream(new FileOutputStream(nomeDoFicheiro));
        }
        catch(IOException e){
            System.out.println(e);
        }
    }

    public Object leObjecto() throws IOException, ClassNotFoundException{
        Object outs= null ;
        try{
            outs=iS.readObject();
        }
        catch(IOException e){
            System.out.println(e);
        }
        catch(ClassNotFoundException e){
            System.out.println(e);
        }
        return outs;
    }

    public void escreveObjecto(Object o) throws IOException{
        try{
            oS.writeObject(o);
        }
        catch(IOException e){
            System.out.println(e);
        }
    }

    public void fechaLeitura() throws IOException{
        try{
            iS.close();
        }
        catch(IOException e){
            System.out.println(e);
        }
    }

    public void fechaEscrita() throws IOException{
        try{
            oS.close();
        }
        catch(IOException e){
            System.out.println(e);
        }
    }
}

este é um exemplo de uma classe q escreve no ficheiro de objectos generico
Código:
import java.io.IOException;

class EscreveNoFicheiro{

	private FicheiroObjectos fileObj = new FicheiroObjectos();
	
	EscreveNoFicheiro(){}

	public boolean escreve(String nomeDoFicheiro, Object conteudo){
		boolean escreveu = true;
		try {
			fileObj.abreEscrita(nomeDoFicheiro);

			fileObj.escreveObjecto(conteudo);
			fileObj.fechaEscrita();
		} catch (IOException e) {
			System.out.println("Erro ao escrever no ficheiro: "+nomeDoFicheiro);
			escreveu = false;
		}
		return escreveu;
	}
}

ao definir no 2º parametro de entrada como object, posso receber uma estrutura de dados ou um simples objecto. se queres gravares varios objectos tens q simplesmente guardar a estrutura onde tens todos os objectos
 
Última edição:
Antes demais peço desculpa pela falha. Esqueci-me de mencionar que era linguagem Java mas o pessoal percebeu :P

Obrigado.

Então seria qualquer coisa deste género certo?

Código:
public boolean escreve(String nomeDoFicheiro, Vector vect){

}

Eu por acaso já não me lembro se tentei assim, mas vou experimentar. Obrigado pela dica.

Já agora, eu posso deixar o 2º parâmetro assim: Vector vect? Ou tenho de fazer o cast devido?
Se tiver de fazer o cast tenho de fazer um método para escrita para cada vector de objectos certo?

Obrigado
 
Antes demais peço desculpa pela falha. Esqueci-me de mencionar que era linguagem Java mas o pessoal percebeu :P

Obrigado.

Então seria qualquer coisa deste género certo?

Código:
public boolean escreve(String nomeDoFicheiro, Vector vect){

}

Eu por acaso já não me lembro se tentei assim, mas vou experimentar. Obrigado pela dica.

Já agora, eu posso deixar o 2º parâmetro assim: Vector vect? Ou tenho de fazer o cast devido?
Se tiver de fazer o cast tenho de fazer um método para escrita para cada vector de objectos certo?

Obrigado

assim estas a dizer explicitamente q vais guardar um vector no ficheiro de objectos, se é isso que queres, tudo bem. Ao escreveres não precisas de fazer cast, somente na leitura do objecto no ficheiro.
 
Pessoal, pelos vistos estou com problemas aqui, e agora o programa passa-se (e antes conseguia escrever e ler +/- bem...).

O objectivo (ao testar) é criar à unha, por exemplo 1 funcionário (e mais uns quantos objectos diferentes). O que eu faço é ir ler o ficheiro que contem os objectos do tipo Funcionario e colocar esses objectos todos num vector. Tendo esse vector, adiciona-se o funcionário que se cria e volta-se a escrever o vector actualizado na integra no ficheiro (actualizaçao da lista de funcionarios). Depois carrega para uma string[], linhas de ficheiros de texto correspondentes e faz-se o mesmo procedimento para actualizar esse ficheiro de texto.

Para o exemplo do funcionário o meu código é o seguinte:

LEITURA

Código:
 // -- lê objectos dos ficheiros e coloca-os num Vector que é retornado
 public static Vector leFicheiroObjectos(int type) throws IOException, ClassNotFoundException{

  ObjectInputStream ois = null;   
  if(type == 3){
   fileName = "Funcionarios.dat";
   Vector<Funcionario> funcionarios = new Vector<Funcionario>();
    
    try{
     ois = new ObjectInputStream(new FileInputStream(fileName));   

     Funcionario f = (Funcionario) ois.readObject();

    
     while(f != null){
      funcionarios.addElement(f);
      f = (Funcionario) ois.readObject();
     }

    }catch(Exception e){
     e.printStackTrace();
    }finally{
      try{
       if (ois == null){ 
        System.out.println("Chegou ao final da leitura do ficheiro.");
        ois.close();
       }else{ 
         System.out.println("ObjectInputStream não foi aberto.");
        }
       }catch(IOException e){
         System.out.println("Não foi possível fechar o ObjectInputStream.");
        } 
      }

   vect_retornado = funcionarios;  
   
  }

return vect_retornado; //inicializado no inicio da classe
}


ESCRITA

Código:
// -- escreve um Objecto num ficheiro de objectos
 public void escreveFicheiroObjectos(int type, Vector vector) throws IOException, ClassNotFoundException{
 
  ObjectOutputStream oos = null;   
  int i;
     
  if(type == 1){
   fileName = "Clientes.dat";
  }else if(type == 2){
    fileName = "Encomendas.dat";
  }else if(type == 3){
    fileName = "Funcionarios.dat";     
  }else if(type == 4){
    fileName = "RegistoAlugueres.dat";    
  }else if(type == 5){
    fileName = "RegistoVendas.dat";  
  }else if(type == 6){
    fileName = "RelatorioMensal.dat";
  }else if(type == 7){
    fileName = "Videos.dat";
  }

  try{

   oos = new ObjectOutputStream(new FileOutputStream(fileName));
   
   for(i = 0; i < vector.size(); i++){  
    oos.writeObject(vector.elementAt(i));
   }
   
   //oos.writeObject(vector);
   
  }catch (IOException e){
   e.printStackTrace();
  }finally{
    try{
     if (oos == null){ 
      System.out.println("Chegou ao final da escrita do ficheiro.");
      oos.close();
     }else{ 
      System.out.println("ObjectOutputStream não foi aberto.");
     }
    }catch(IOException e){
     System.out.println("Não foi possível fechar o ObjectOutputStream.");
    } 
   } 
 
 }


Também já tente do seguinte modo:

ESCRITA

Código:
oos.writeObject(vector);

LEITURA

Código:
funcionarios = (Vector) ois.readObject();


Qual a melhor maneira a utilizar? Ler o vector do ficheiro e depois fazer vector.addElement(Objecto) e escrever vector no ficheiro (o que o actualiza). Ou da primeira forma: carregar o vector do ficheiro, adicionar um objecto, enviar o vector como parametro, e escrever objecto a objecto desde o inicio ate ao final do vector no ficheiro de objectos?

Outra dúvida, será que eu, por na primeira vez que leio o ficheiro e ele não tem lá nada dá EOFException?

Obrigado a todos que colaboraram/rem
 
Back
Topo