1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

EOF Exception

Discussão em 'Programação' iniciada por lilcrazy, 4 de Dezembro de 2007. (Respostas: 4; Visualizações: 1366)

  1. lilcrazy

    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
     
  2. CyberOps

    CyberOps I'm cool cuz I Fold

    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: 4 de Dezembro de 2007
  3. lilcrazy

    lilcrazy Power Member

    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
     
  4. CyberOps

    CyberOps I'm cool cuz I Fold

    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.
     
  5. lilcrazy

    lilcrazy Power Member

    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
     

Partilhar esta Página