ReadObject方法

时间:2013-03-05 11:52:02

标签: java exception-handling objectinputstream

无论如何要检查类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

2 个答案:

答案 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
}