簡體   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