2017-08-29 69 views
-1

我需要一些关于Java文件IO操作的帮助。我试图追加序列化的对象到我的文件,但只有最后一个对象被追加到文件。 我尝试了很多建议,但没有成功。 我如何才能做到这一点,请帮忙?附加Java序列化对象

这里是我的代码:

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; 

} 

} 

我在这里已经检查: 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

快速浏览一下ObjectOutputStream文档并不会让我相信有一个writeObject的重载会追加新的对象。我认为这有很好的理由。您可能需要考虑不直接序列化对象,而是将其序列化为字符串,然后使用带附加选项的输出流将其写入文件。反序列化将涉及将文件中的每一行解组到新的Signup对象。或者,您可以序列化您的对象的集合,并从它解组相同的集合类型。 –

+0

@MarkW'String'不是二进制数据的容器。 – EJP

+0

@EJP我建议他将它序列化为一个字符串。他没有理由为什么他不能把他的东西放在一根绳子上。字符串可以是从XML到逗号分隔的字段键值对之间的任何内容。没关系。无论存储格式如何,序列化都是序列化的。 –

回答

0

你需要创建一个新的Signup对象中的循环每一次,要不然每次拨打ObjectOutputStream.reset(),或使用ObjectOutputStream.writeUnshared()

但还有其他问题。

  • 您应该在文件输出流之前关闭对象输出流,而不是。
  • 您不能附加到对象输出流,至少不会像这样简单。为什么不能看到我关于'StreamCorruptedException - 无效类型代码AC'的回答。您需要在第二个链接中使用该技巧。