Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα, Προσπαθώ να γράψω αντικείμενα σε ένα αρχείο. Αν το αρχείο υπάρχει τότε να γράφει σε αυτό χωρίς overload, αλλιώς να το δημιουργεί. Το πρόβλημα μου είναι στο πρώτο. Η δεν το γράφει η υπάρχει κάποιο πρόβλημα στο διάβασμα. Κάτι διάβασα ότι παίζει με τα headers Κλπ αλλά δεν έχω βγάλει άκρη. Όποια βοήθεια δεκτή :rolleyes: Ευχαριστώ!!!!!!!!

Ο κωδικας μου:

 

Γράψιμο

>


import java.io.*;


public class WriteFile {
   public void setContact(Agenda contact){
       ObjectOutputStream out;
       
             
       try{
           
           File file = new File("Contacts.txt");
           
           boolean exists = file.exists();
                           
           if(exists == true){
               out = new ObjectOutputStream(new FileOutputStream(file,true));
               out.writeObject(contact);
               out.flush();
               out.close();
           }
           
           else{
               out = new ObjectOutputStream(new FileOutputStream(file,false));
               out.writeObject(contact);
               out.flush();
               out.close();
           }
                             
           
           /*
           File file = new File("Contacts.txt");
           boolean exists = file.exists();
           out = new ObjectOutputStream(new FileOutputStream(file,exists));
           out.writeObject(contact);            
           
           
           out.flush();
           out.close();
           */
           System.out.println("Object written to file");
       }
       catch (FileNotFoundException ex) {
           System.out.println("Error with specified file") ;
           ex.printStackTrace();
       }
       catch (IOException ex) {
           System.out.println("Error with I/O processes") ;
           ex.printStackTrace();
       }              
   } 
   
}

 

Διάβασμα από αρχείο:

>

package icsd07085_week01;
import java.io.*;
import javax.swing.*;

public class ReadFile {
   
  public void getFile(){
      ObjectInputStream in = null;
      Agenda cont = null;
      
      try{
          in = new ObjectInputStream(new FileInputStream("Contacts.txt"));
          
          while( (cont = (Agenda) in.readObject()) != null){
              System.out.println(cont);
              int mc = JOptionPane.DEFAULT_OPTION;
              JOptionPane.showMessageDialog (null,"Name: "+cont.getName()+" Surename: "+cont.getSurname(), "Contacts\n", mc);
          }
      }
      
      catch (EOFException ex) {
          System.out.println("End of file reached.");
      }
      
      catch (ClassNotFoundException ex) {
          System.out.println("Error casting") ;
          ex.printStackTrace();
      }
      
      catch (FileNotFoundException ex) {
          System.out.println("Error specified file does not exist") ;
          ex.printStackTrace();
      }
      
      catch (IOException ex) {
          System.out.println("Error with I/O processes") ;
          ex.printStackTrace();
      }
      
      finally {
          try{
              in.close();
          }
          catch(IOException ex){
              System.out.println("Another IOException during the closing");
              ex.printStackTrace();
          }
      }
      
      System.out.println(" "+cont.getName()+" "+cont.getSurname());
     

      
  }
   
}

Επεξ/σία από jimmysnn_17
Δημοσ.

Η κλάση που κάνω serialize ειναι Agenda.

τα errors είναι:

>
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at icsd07085_week01.ReadFile.getFile(ReadFile.java:15)
at icsd07085_week01.MakeAgenda.actionPerformed(MakeAgenda.java:122)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Δημοσ.

1. Ποιό είναι το implementation της κλάσσης που κάνεις serialize (Agenda). Κάνει implement το java.io.Serializable interface? Αυτό σημαίνει παράθεσε μας εδώ τον κώδικα της κλάσσης Agenda

2. Τι έρρορς παίρνεις? Εσύ μας παραθέτεις μονο το ΠΟΥ προέκυψαν τα λάθη και όχι τα ΠΟΙΑ λάθη έγιναν. Βάλε μας όλο το output

Δημοσ.

1)Η κλάση Agenda

>


import java.io.Serializable;


class Agenda implements Serializable {
   private String name=null;
   private String surname=null;
   private String address=null;
   private String birth=null;
   private String marital_status=null;
   
   
   public void setName(String name){
       this.name=name;
   } 
   
   public void setSureame(String surname){
       this.surname=surname;
   }
   
   public void setAddress(String address){
       this.address=address;
   }
   
   public void setBirth(String birth){
       this.birth=birth;
   }
   
   public void setMarital_status(String marital_status){
       this.marital_status=marital_status;
   }
   
  public String getName(){
      return this.name;
  }
  
  public String getSurname(){
      return this.surname;
  }
  
  public String getAddress(){
      return this.address;
  }
  
  public String getBirth(){
      return this.birth;
  }
  
  public String getMarital_status(){
      return this.marital_status;
  }
  
     
}

 

2)στο output χτυπάει το IOException

Συγκεκριμένα το output:

show patithike

icsd07085_week01.Agenda@1e2afb2

Error with I/O processes

... Και το υπόλοιπο που έβαλα παραπάνω!!!

 

Επίσης όπως το έψαχνα πρέπει να υπάρχει κάπου λάθος στη κλάση ReadFile. Αλλά δεν το βρήσκω :whistle:

Δημοσ.

το λάθος είναι στην WriteFile και όχι στην ReadFile

 

ο ObjectOutputStream constructor γράφει το serialization stream header το οποίο αναμένεται να υπάρχει μία και μόνο μία φορά στην αρχή του αρχείου

 

έτσι καλώντας τον συνέχεια --->new ObjectOutputStream(new FileOutputStream(file,true));

θα έχει σαν αποτέλεσμα να γραφεί η επικεφαλίδα πολλές φορές στο ίδιο αρχείο

κατι το οποίο χαλάει το αρχείο (corrupt).

 

Επειδή υπάρχει η πιο πάνω απαίτηση (1 μόνο επικεφαλίδα στην αρχή του αρχείου)

η προσθήκη(appending) στο αρχείο θα το χαλάσει

 

Πρέπει λοιπόν να γράψεις όλα τα αντικείμενα στον αρχείο με το ίδιο stream(μία φορά new ObjectOutputStream(new FileOutputStream(file,true)); για όλα τα αντικείμενα που θα αποθηκεύσουμε)

 

Αν θέλεις να υλοποιήσεις το append, πρέπει να διαβάζεις το αρχείο στην μνήμη και μετά να το ξαναγράφεις σε νέο αρχείο μαζί με τα νέα αντικείμενα.

 

και το πιο απλό είναι

 

>
import java.io.*;
public class AppendableObjectOutputStream extends ObjectOutputStream {

 public AppendableObjectOutputStream(FileOutputStream out) throws IOException{
   super(out);
 }

 @Override
 protected void writeStreamHeader() throws IOException {
   // κάνουμε override την μέθοδο που γράφει την επικεφαλίδα 
   //ώστε να μην την γράφει όταν θέλουμε να κάνουμε append
 }

}

 

>
import java.io.*;


public class WriteFile {

   public void setContact(Agenda contact){
   	        ObjectOutputStream out=null;
  		try{
		File file = new File("Contacts.txt");
		boolean exists = file.exists();                
       	if(exists == true){
               out = new AppendableObjectOutputStream(new FileOutputStream(file,true));
       	}else{
               out = new ObjectOutputStream(new FileOutputStream(file,false));
       	}
  		}catch(IOException e){
       	System.out.println(e);
       }
             
       try{
       	out.writeObject(contact);
           out.flush();
           System.out.println("Object written to file");
           out.close();
       }
       catch (FileNotFoundException ex) {
           System.out.println("Error with specified file") ;
           ex.printStackTrace();
       }
       catch (IOException ex) {
           System.out.println("Error with I/O processes") ;
           ex.printStackTrace();
       }              
   } 
   
}

Δημοσ.

jimmysnn_17, δεν τη γουστάρω τη java "ΚΑΘΟΛΟΥ ΟΜΩΣ!!" αλλά απ'ότι βλέπω στην Agenda Class σου,, ορίζεις οτι κάνει Implement το Interface Serializable, αλλά οι stub μέθοδοι που πρέπει να κάνεις Implement δεν υπάρχουν ...

 

>
private void writeObject(java.io.ObjectOutputStream out)
    throws IOException
private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException;

 

Το οτι απλώς όρισες ένα Interface ως implemented από την κλάση δεν σημαίνει οτι τελειώσες ... το Interface έχει και συγκεκριμένα χαρακτηριστικά που πρέπει να υπάρχουν στη κλάση για να δουλέψει ...

 

Δες σχετικά εδώ

Δημοσ.

jimmysnn_17, δεν τη γουστάρω τη java "ΚΑΘΟΛΟΥ ΟΜΩΣ!!" αλλά απ'ότι βλέπω στην Agenda Class σου,, ορίζεις οτι κάνει Implement το Interface Serializable, αλλά οι stub μέθοδοι που πρέπει να κάνεις Implement δεν υπάρχουν ...

 

>
private void writeObject(java.io.ObjectOutputStream out)
	throws IOException
private void readObject(java.io.ObjectInputStream in)
	throws IOException, ClassNotFoundException;

 

Το οτι απλώς όρισες ένα Interface ως implemented από την κλάση δεν σημαίνει οτι τελειώσες ... το Interface έχει και συγκεκριμένα χαρακτηριστικά που πρέπει να υπάρχουν στη κλάση για να δουλέψει ...

 

Δες σχετικά εδώ

 

Αυτό είναι εντελώς λάθος. Εφόσον δεν χρειάζεται κάποια ειδική αντιμετώπιση, αρκεί να γράψεις implements Serializable χωρίς να υλοποιήσεις τίποτα στην κλάση σου. Εδώ η κλάση Agenda περιλαμβάνει πεδία απλά String και δεν χρειάζεται τίποτα άλλο.

 

Αν ήταν υποχρεωτική η υλοποίηση κάποιων μεθόδων, θα υπήρχε λάθος στη μεταγλώττιση.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...