我将一系列不同的对象序列化为二进制文件。如何将文件读取到最后?
try {
ObjectInputStream reader = new ObjectInputStream(new FileInputStream(fname));
Object obj = reader.readObject();
if (obj instanceof Azienda) {
Azienda a = (Azienda) obj;
company.put(a.getCod(), a);
} else if (obj instanceof Privato) {
Privato p = (Privato) obj;
privato.put(p.getCod(), p);
}
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} catch (FileNotFoundException ffe) {
System.err.println("Error: the file was not found!");
} catch (IOException ioe) {
ioe.printStackTrace();
}
这样我每次读取只读一次对象。
当我阅读文本文件时,我使用null
答案 0 :(得分:4)
try{
while(true) {
Object obj=reader.readObject()
// do sth with object
}
}catch(EOFException e){
//we expect it so ignore
}
除了异常,当您为ObjectInputStream读取它时,除了异常之外没有EOF检查,因此您将不得不使用称为控制流异常的代码气味
答案 1 :(得分:1)
ObjectInputStream reader = null;
try {
reader = new ObjectInputStream(new FileInputStream("sth"));
Object obj = null;
while ((obj = reader.readObject()) != null) {
System.out.println(obj);
}
} catch (EOFException e) {
System.out.println("finnished reading");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (FileNotFoundException ex) {
System.err.println("Error: the file was not found!");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
reader.close();
}
答案 2 :(得分:1)
当没有更多对象要从流中读取时,似乎抛出了EOFException。不幸的是,它甚至没有记录。所以,我看到以下解决方案:
List<Object>
。最后一个解决方案当然可以防止将对象动态写入流中,并强制您在序列化之前将所有对象都放在内存中。答案 3 :(得分:1)
ObjectInputStream
没有用于检查文件结尾的具体方法。
但read...()
的每个ObjectInputStream
方法在尝试读取文件末尾时会抛出EOFException
。不幸的是,readObject()
没有明确记录,但它适用于所有其他方法(readInt()
等。)
http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html