在Java中反序列化文件中的对象

我有一个文件,其中包含类XYZ的多个序列化对象。 序列化时,每个XYZ对象都附加到文件中。

现在我需要从文件中读取每个对象,并且我只能读取第一个对象。

知道如何从文件中读取每个对象并最终将其存储到List中吗?

请尝试以下方法:

 List results = new ArrayList(); 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(); } 

继Tom的精彩评论之后,多个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 results = new ArrayList(); 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); } 

您不能将ObjectOutputStreams附加到文件。 它们包含标题以及您编写的对象。 修改你的技术。

你的EOF检测也是错误的。 你应该分别捕获EOFException。 OptionalDataException意味着完全不同的东西。

这对我有用

  System.out.println("Nombre del archivo ?"); nArchivo= sc.next(); sc.nextLine(); arreglo=new ArrayList(); 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 

您可以按照下面提到的代码来处理文件结尾:

 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(); } } 

它将从文件中写入和读取多个整数对象,而不会抛出任何exception。