繁体   English   中英

Java有选择地使用字节读取序列化的对象

[英]java reading serialized objects selectively using byte

我正在尝试编写一个程序,该程序根据给定的字节偏移量有选择地从文件中读取序列化的对象。 我首先将文件中的三个相同类型的对象序列化,然后使用FileInputStream,ByteArrayInputStream和ObjectInputStream读取它们。 但是每次我尝试读取一个特定的对象时,它总是返回我第一个对象。 这是小程序:

   public class TestObject implements Serializable {

    String term;
    double value;

    public TestObject(String term, double value) {
        this.term =term;
        this.value = value;
    }       

    public String toString() {
        String str = term + " : " + value;
        return str;
    }
}

   public class ObjectReader {

public static void main(String[] args) throws IOException,ClassNotFoundException {

            TestObject t1 = new TestObject("abc", 1.0);
    TestObject t2 = new TestObject("xyz", 1.0);
    TestObject t3 = new TestObject("123", 1.0);

            //Writing 3 objects to file and displaying offsets

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream objOut = new ObjectOutputStream(baos);
    FileOutputStream fos = new FileOutputStream("data.dat");
    objOut.writeObject(t1);     

    byte[] arr = baos.toByteArray();
    System.out.println(arr.length);  //displays 81
    fos.write(arr);

    objOut.writeObject(t2);
    arr= baos.toByteArray();
            System.out.println(arr.length);  //displays 101 
    fos.write(arr);

    objOut.writeObject(t3);     
    arr= baos.toByteArray();
            System.out.println(arr.length);  //displays 121
    fos.write(arr);

    fos.close();
    objOut.close();

    //Reading a specific object back using offset

    FileInputStream fis = new FileInputStream("data.dat");
    byte[] inArr = new byte[101];
    fis.skip(81);    //skip to second object
    fis.read(inArr);  

    System.out.println(fis.available());  //displays 121 which is correct

    ByteArrayInputStream bain = new ByteArrayInputStream(inArr);
    ObjectInputStream objIn = new ObjectInputStream(bain);
    TestObject t4 =(TestObject)objIn.readObject();
    System.out.println(t4);
     }
    }

但是,每次我运行该程序时,它仅显示第一个对象(abc:1.0)。 这可能是什么原因? 这样无法读取序列化的对象吗? 请忽略效率问题,因为我只是想了解概念和实验。

ObjectOutputStream是一个状态机,当您写入多个对象时,它仅写入增量数据,为了写入所有数据,您可以执行ObjectOutputStream.reset(),它将忘记先前的写入并写入包含所有信息的新数据。 或者,您可以按照Peter所说的为每个对象创建一个新的ObjectOutputStream。

从javadoc:

必须从相应的ObjectInputstream中以与写入对象相同的类型和顺序读取对象。

如果不关闭流,请确保在writeObject之后进行刷新。

同样,您继续将整个byte[]写入fos 因此,通过您的三个电话,您正在执行以下操作:

  1. 写对象1
  2. 写对象1和2
  3. 写对象1&2&3

而是使用write(byte[], int, int)

要独立读取每个对象,您需要将每个对象写入其自己的ObjectOutputStream中。 除了流的开始之外,您无法在任何地方启动ObjectStream。 但是,您可以将多个流写入文件,并且只要知道流的开始和结束即可重新构造对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM