Десериализация объектов из файла в Java - PullRequest
5 голосов
/ 19 октября 2011

У меня есть файл, который содержит несколько сериализованных объектов класса XYZ.При сериализации каждый объект XYZ был добавлен в файл.

Теперь мне нужно прочитать каждый объект из файла, и я могу читать только первый объект.

Любая идея, как я могу прочитать каждый объект из файла и в конечном итоге сохранить его в список?

Ответы [ 4 ]

11 голосов
/ 19 октября 2011

Попробуйте следующее:

List<Object> results = new ArrayList<Object>();
FileInputStream fis = new FileInputStream("cool_file.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);

try {
    while (true) {
        results.add(ois.readObject());
    }
} catch (OptionalDataException e) {
    if (!e.eof) 
        throw e;
} finally {
    ois.close();
}

В ответ на блестящий комментарий Тома решение для нескольких ObjectOutputStream с будет

public static final String FILENAME = "cool_file.tmp";

public static void main(String[] args) throws IOException, ClassNotFoundException {
    String test = "This will work if the objects were written with a single ObjectOutputStream. " +
            "If several ObjectOutputStreams were used to write to the same file in succession, " +
            "it will not. – Tom Anderson 4 mins ago";

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(FILENAME);
        for (String s : test.split("\\s+")) {
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(s);
        }
    } finally {
        if (fos != null)
            fos.close();
    }

    List<Object> results = new ArrayList<Object>();

    FileInputStream fis = null;
    try {
        fis = new FileInputStream(FILENAME);
        while (true) {
            ObjectInputStream ois = new ObjectInputStream(fis);
            results.add(ois.readObject());
        }
    } catch (EOFException ignored) {
        // as expected
    } finally {
        if (fis != null)
            fis.close();
    }
    System.out.println("results = " + results);
}
1 голос
/ 20 октября 2011

Вы не можете добавлять ObjectOutputStreams в файл. Они содержат заголовки, а также объекты, которые вы написали. Пересмотрите свою технику.

Также ваше EOF-обнаружение неверно. Вы должны ловить EOFException отдельно. OptionalDataException означает что-то совершенно другое.

0 голосов
/ 20 июля 2016

Вы можете следовать приведенному ниже коду для обработки конца файла по-разному:

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
    // TODO Auto-generated method stub

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E://sample.txt"));
    oos.writeObject(new Integer(5));
    oos.writeObject(new Integer(6));
    oos.writeObject(new Integer(7));
    oos.writeObject(new Integer(8));
    oos.flush();
    oos.close();

    ObjectInputStream ios = new ObjectInputStream(new FileInputStream("E://sample.txt"));
    Integer temp;
    try {
        while ((temp = (Integer) ios.readObject()) != null) {
            System.out.println(temp);
        }
    } catch (EOFException e) {

    } finally {
        ios.close();
    }

}

Он будет записывать и читать несколько целочисленных объектов из файла без исключения.

0 голосов
/ 29 июня 2016

это работает для меня

  System.out.println("Nombre del archivo ?");
                  nArchivo= sc.next();
                  sc.nextLine();
                  arreglo=new ArrayList<SuperHeroe>();

                  try{

                         FileInputStream fileIn = new FileInputStream(nArchivo);
                         ObjectInputStream in = new ObjectInputStream(fileIn);

                        while(true){
                            arreglo.add((SuperHeroe) in.readObject());

                        }



                    }

                      catch(IOException i)
                      {
                         System.out.println("no hay mas elementos\n elementos cargados desde el archivo:" );

                         for(int w=0;w<arreglo.size();w++){
                          System.out.println(arreglo.get(w).toString());
                         }



                      }catch(ClassNotFoundException c)
                      {
                         System.out.println("No encontre la clase Estudiante !");
                         c.printStackTrace();

                         return;
                      }  
...