2016-11-22 51 views
0

我基本上做一个日记应用程序,其中每个单独的日记条目需要坚持,我想保留所有条目在一个单一的文件。序列化多个条目到同一个文件

我见过吨教程上序列化一个对象,所以我想出了这个解决方案,(不工作)但即使我设法解决它,感觉就像一个草率的解决方案。

(在这里,我试图序列一个ArrayList,每一次我保存的条目时,我反序列化列表,再次序列化之前添加新条目列表)

为了澄清,我的问题是:这是将对象保存到同一个文件的好方法吗?

还是没有人有一些关于别的东西的提示我应该尝试一下,关于这个视频或文档的链接也很感激。

public class Serializer 
{ 

    //Calls readFile and adds the returned entries to an ArrayList 
    //Add the target object to the list and write to the file 
    public static void writeToFile(Object target) 
    { 
     ArrayList entries = new ArrayList(); 

     entries = readFile(); 
     entries.add(target); 


     String filename = "entries.bin"; 

     FileOutputStream fileOut = null; 
     ObjectOutputStream objOut = null; 

     try 
     { 
      fileOut = new FileOutputStream(filename); 
      objOut = new ObjectOutputStream(fileOut); 
      objOut.writeObject(entries); 
      objOut.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    //Reads the file and returns all entries in a list 
    public static ArrayList readFile() 
    { 
     ArrayList persistedEntries = new ArrayList<>(); 
     String filename = "entries.bin"; 

     FileInputStream fileIn = null; 
     ObjectInputStream objIn= null; 
     try 
     { 
      fileIn = new FileInputStream(filename); 
      objIn = new ObjectInputStream(fileIn); 
      persistedEntries = (ArrayList) objIn.readObject(); 
      objIn.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     return persistedEntries; 
    } 
} 
+0

这可能帮助,如果你还别说在这种方式,它“不工作” - 它抛出一个异常?哪一个? – Hulk

+0

我实际上并不确定什么是不工作的,因为我得到一个索引超出范围的异常,如果我已经理解不应该能够发生的ArrayLists。但我只试图运行程序,而不是自己的方法。 但是,正如你所看到的,我的问题并不是关于代码不工作的事实,我只是想看看这个“想法”是否好,或者如果我完全错过了某些东西,方向。 :) –

+0

看着你的代码,我注意到你在编写一个文件之前总是“读取”。必须检查空白文件'entries.bin'以查看返回的ArrayList对象是什么? – jrbeverly

回答

0

这是对象保存到同一文件的好方法,在多个场合?

我会认为没有。这是因为您的方法writeToFile或更准确地说appendToFile可能会在边缘情况下引入奇怪的行为(例如具有意外对象的entries.bin)。我会为此辩解:

使用writeToFile(ArrayList<Object> target)覆盖指定数组的文件。然后添加一个方法appendToFile(Object target),该方法处理从磁盘读取entries.bin的过程,附加target然后将该数组写入磁盘。这具有分离与将新对象target与磁盘上的文件“合并”相关的任何逻辑以及写入entries.bin文件的实际逻辑的优点。

如果只是一个学习练习,我会去与上述。潜在resource


添加新格式:

public class Serializer 
{ 
    private String filename; 

    // pass in "entries.bin" 
    public Serializer(String filename) { 
     this.filename = filename; 
    } 

    public void append(Object target) { 
     // readfile will return at least empty arraylist 
     ArrayList entries = readFile(); 
     entries.add(target); 
     serialize(entries); 
    } 

    public void serialize(ArrayList entries) 
    { 
     FileOutputStream fileOut = null; 
     ObjectOutputStream objOut = null; 
     try 
     { 
      fileOut = new FileOutputStream(filename); 
      objOut = new ObjectOutputStream(fileOut); 
      objOut.writeObject(entries); 
      objOut.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    //Reads the file and returns all entries in a list 
    public ArrayList deserialize() 
    { 
     ArrayList persistedEntries = new ArrayList<>(); 

     FileInputStream fileIn = null; 
     ObjectInputStream objIn = null; 
     try 
     { 
      fileIn = new FileInputStream(filename); 
      objIn = new ObjectInputStream(fileIn); 

      Object result = objIn.readObject(); 
      if (!(result instanceof ArrayList)) { 
       // read object is not an arraylist 
      } 

      persistedEntries = (ArrayList) objIn.readObject(); 
      objIn.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     return persistedEntries; 
    } 
} 
+0

为什么?第二种方法完全等同于添加到列表中,然后调用第一种方法。两行代码。 – EJP

+0

第二种方法你的意思是'appendToFile'?正如我上面所说,它是关于分离逻辑和良好的编码实践。通过代码他正在使用'writeToFile'来处理以下任务:构造内存数据,从源数据读取数据,将源数据与内存数据同步,将数据写入源代码。以及与此相关的所有潜在错误和边缘情况。他将每个责任分解成一个单独的方法更有意义。 – jrbeverly

相关问题