чтение Java сериализованных объектов выборочно с помощью байта - PullRequest
1 голос
/ 24 ноября 2011

Я пытаюсь написать программу, которая выборочно читает сериализованные объекты из файла с учетом их байтовых смещений.Я начал с сериализации трех объектов одного типа в файле, а затем прочитал их, используя 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).Что может быть причиной этого?Разве нельзя читать сериализованные объекты, как это?Пожалуйста, игнорируйте вопросы эффективности, так как я просто пытаюсь понять концепцию и эксперимент.

Ответы [ 4 ]

0 голосов
/ 15 октября 2013

ObjectOutputStream - это конечный автомат, который записывает только инкрементные данные, когда вы пишете множественные объекты, чтобы записать все данные, которые вы можете выполнить ObjectOutputStream.reset (), он забудет о предыдущих записях и запишет свежие данные со всей включенной информацией.Или вы можете создать новый ObjectOutputStream для каждого объекта, как сказал Питер.

Из javadoc:

Объекты должны быть прочитаны обратно из соответствующего ObjectInputstream с теми же типами и в том же порядке, что и они.были написаны.

0 голосов
/ 24 ноября 2011

Кроме того, вы продолжаете писать все byte[] в fos.Итак, за три вызова вы делаете:

  1. Запись объекта 1
  2. Запись объекта 1 & 2
  3. Запись объекта 1 & 2 & 3

Вместо этого используйте write(byte[], int, int).

0 голосов
/ 24 ноября 2011

Чтобы прочитать каждый объект независимо, вам нужно записать каждый объект в свой собственный ObjectOutputStream.Вы не можете запустить ObjectStream нигде, кроме начала потока.Однако вы можете записать несколько потоков в файл и при условии, что вы знаете начало и конец потока, воссоздаете объект.

0 голосов
/ 24 ноября 2011

Убедитесь, что вы выполняете сброс после writeObject, если не закрываете потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...