无论如何要检查类ObjectInputStream的方法readObject是否已经完成读取文件而不是捕获它抛出的异常?
如果没有。我该如何制作outNewmast.writeObject(accountRecord);在这种情况下达成的声明?
// read oldmast.ser
try {
while (true) {
accountRecord = (AccountRecord) inOldmast.readObject();
//read trans.ser
while (true) {
transactionRecord = (TransactionRecord) inTrans.readObject();
if (transactionRecord.getAccountNumber() == accountRecord.getAccount()) {
accountRecord.combine(transactionRecord);
}//end if
}//end inner while
outNewmast.writeObject(accountRecord);
}//end while
}//end try
catch (ClassNotFoundException e) {
System.err.println("Error reading file.");
System.exit(1);
}//end catch
catch (IOException e) {
System.err.println("Error reading file.");
System.exit(1);
}//end catch
答案 0 :(得分:2)
最好的想法是预先序列化元素的数量,所以你可以这样做:
cnt = file.readInt();
for (int i=0;i<cnt;i++) {
file.readObject();
}
@ChrisCooper提出的方法不可靠,如文档中所述。有些流没有实现它,或返回近似结果(理论上,它甚至可以在仍有一些数据时返回0。例如 - 网络流)。
因此,查看相同的文档,我们找到了这个特定的块:
任何读取超出边界的对象数据的尝试 由相应的writeObject方法写入的自定义数据将导致 一个以eof字段值为true抛出的OptionalDataException。 超出分配数据末尾的非对象读取将会 以与他们指示数据相同的方式反映数据的结尾 流结束:逐字节读取将返回-1作为字节读取或 读取的字节数,原始读取将抛出EOFExceptions。如果 没有相应的writeObject方法,那么默认结束 序列化数据标志着分配数据的结束。
所以,最好的办法是抓住OptionalDataException
并查看eof
的{{1}}字段。
进一步消化答案,这是你想要的方法:
true
答案 1 :(得分:1)
是的,检查输入流以查看是否还有其他内容:
http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()
if (inOldmast.available() > 0) {
// read and process
} else {
// Close the stream and clean up
}