2017-08-29 2 views
-1

Ich brauche ein wenig Hilfe bei Java File IO-Operationen. Ich versuche, das serialisierte Objekt an meine Datei anzuhängen, aber nur das letzte Objekt wird an die Datei angehängt. Ich habe viele Vorschläge ausprobiert, aber noch keinen Erfolg. Wie kann ich das erreichen, bitte helfen?Anfügen von serialisierten Java-Objekten

Hier ist mein Code:

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.Scanner; 




public class Working { 

    String FILENAME = "E:\\assignment\\userpass\\userpass.txt"; 

    Scanner sc = new Scanner(System.in); 
    String sUser = null, sPass = null, sRole = null; 

    Signup signup = new Signup(); 

    public void createUser(){ 

     System.out.println(" Enter username: "); 
     sUser = sc.next(); 

     System.out.println(" Enter password: "); 
     sPass = sc.next(); 

     System.out.println(" Enter Role: "); 
     sRole = sc.next(); 


     Working obj = new Working(); 

     signup.setUsername(sUser); 
     signup.setPassword(sPass); 
     signup.setRole(sRole); 

     obj.serializeUser(signup); 


    } 





public void serializeUser(Signup signup){ 

     FileOutputStream fout = null; 
     ObjectOutputStream oout= null; 

     File file = new File(FILENAME); 

     try{ 

     // fout = new FileOutputStream(file); 
     // fout = new FileOutputStream(file.getAbsoluteFile(), true); 
      fout = new FileOutputStream(file, true); 
     // fout = new FileOutputStream(FILENAME); 
      oout = new ObjectOutputStream(fout); 
      oout.writeObject(signup); 

      System.out.println("User has been serialized"); 

     } catch(Exception e){ 
      e.printStackTrace(); 

     } finally { 

      if(fout != null){ 
       try{ 

        fout.close(); 
       } catch(IOException e){ 
        e.printStackTrace(); 
       } 
      } 

      if(oout != null){ 
       try{ 

        oout.close(); 
       } catch(IOException e){ 
        e.printStackTrace(); 
       } 
      } 

     } 

    } 


// for test purpose 
public void showUsers(){ 
    Working obj = new Working(); 
    Signup add = obj.deserializeUser(FILENAME); 

    System.out.println(add); 
} 

// to show data 
//test purpose 

public Signup deserializeUser(String filename){ 

    Signup userDetails = null; 
    File file = new File(FILENAME); 

    FileInputStream fin = null; 
    ObjectInputStream oin = null; 

    try{ 

     fin = new FileInputStream(file); 
     oin = new ObjectInputStream(fin); 

     userDetails = (Signup) oin.readObject(); 

    } catch(Exception ex){ 
     ex.printStackTrace(); 
    } finally{ 
     if (fin != null) { 
      try { 
       fin.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (oin != null) { 
      try { 
       oin.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return userDetails; 

} 

} 

ich hier bereits eingecheckt haben: 1. http://www.enseignement.polytechnique.fr/informatique/Java/1.8/java/io/FileOutputStream.html#FileOutputStream-java.lang.String-boolean- 2. Appending to an ObjectOutputStream

+0

Ein kurzer Blick auf das Objekt ObjectOutputStream lässt mich nicht glauben, dass writeObject eine Überladung hat, die neue Objekte anhängen wird. Ich denke, dafür gibt es einen guten Grund. Sie sollten in Erwägung ziehen, das Objekt nicht direkt zu serialisieren, sondern es in eine Zeichenfolge zu serialisieren und dann in eine Datei zu schreiben, indem Sie den Ausgabestream mit einer Anhängen-Option verwenden. Bei der Deserialisierung wird jede Zeile in Ihrer Datei auf ein neues Registrierungsobjekt zurückgesetzt. Alternativ können Sie eine Sammlung Ihrer Objekte serialisieren und denselben Sammlertypen daraus entfernen. –

+0

@MarkW 'String' ist kein Container für Binärdaten. – EJP

+0

@EJP Ich schlug vor, er es zu einer Zeichenfolge zu serialisieren. Es gibt keinen Grund, warum er sein Objekt nicht auf eine Saite bringen konnte. Die Zeichenfolge kann alles von XML bis Komma-getrennte Schlüsselwertpaare für die Felder sein. Ist nicht wirklich wichtig. Serialisierung ist Serialisierung, unabhängig vom Speicherformat. –

Antwort

0

Sie benötigen ein neues Signup Objekt jedes Mal, um die Schleife zu erstellen, oder Rufen Sie jedes Mal ObjectOutputStream.reset() an, oder verwenden Sie ObjectOutputStream.writeUnshared().

Allerdings gibt es andere Probleme.

  • Sie sollten den Objektausgabestream vor dem Dateiausgabestream oder statt dessen schließen.
  • Sie können nicht an einen Objektausgangsstrom anhängen, zumindest nicht so einfach. Siehe meine Antwort zu 'StreamCorruptedException - ungültiger Typ Code AC' für warum nicht. Sie müssen die Technik in Ihrem zweiten Link verwenden.