【问题标题】:Appending New Object to the existing file将新对象附加到现有文件
【发布时间】:2013-02-13 11:39:28
【问题描述】:

您好,我在尝试将新对象附加到现有文件时遇到问题.. 再次启动 android 应用程序后,我想获取现有文件并添加一个新对象,然后从现有文件中读取对象...实际上,当我尝试读取对象时,代码将只读取第一个对象..你可以在下面找到代码..你能帮忙吗?谢谢

使用以下方法编写对象:

 public void saveObject(Person p, File f){
     try
     {

         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f, true));
         oos.writeObject(p);
         oos.reset();
         oos.flush(); 
         oos.close();


     }
     catch(Exception ex)
     {
        Log.v("Serialization Save Error : ",ex.getMessage());
        ex.printStackTrace();
     }
}

使用以下方法读取对象:

    public Object loadSerializedObject(File f)
{

       try {
          ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
           try{
              Object loadedObj = null;
              while ((loadedObj = ois.readObject()) != null) {
              Log.w(this.getClass().getName(), "ReadingObjects") ;

            }
              return objects;
           }finally{
               ois.close();
           }

       } catch (StreamCorruptedException e) {
           e.printStackTrace();
       } catch (IOException e) {

           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
       return null;
}

【问题讨论】:

  • 当你返回对象objects在哪里声明?您在哪里为 objects 赋予任何价值?
  • 可能是您将不同的对象写入不同的文件,如果是这样,您实际上是在获取您写入文件的所有对象吗?

标签: java object serialization objectoutputstream objectinputstream


【解决方案1】:

不幸的是,您无法在每次想要追加到流时创建一个新的ObjectOutputStream,然后使用单个流读回所有内容。 constructor 在开始写入对象之前将标头添加到底层流。您可能看到了java.io.StreamCorruptedException: invalid type code: AC 异常,这是因为第一个标头是0xAC

我不知道您要处理多少对象,但一种选择可能是读取所有对象,然后使用单个 ObjectOutputStream 重写它们。如果有很多对象,那可能会变得昂贵。或者,您可能需要考虑通过Externalizable 自己手动管理序列化。不过会很痛。

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2016-08-21
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2018-05-21
    • 2019-11-18
    相关资源
    最近更新 更多