2013-03-05 54 views
0

无论如何检查类ObjectInputStream的方法readObject是否已完成读取文件,而不是捕获其抛出的异常?ReadObject方法

如果否。我怎么能make outNemamast.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

最好的办法是事先序列化元素的数量,所以你可以只做:

cnt = file.readInt(); 
for (int i=0;i<cnt;i++) { 
    file.readObject(); 
} 

@ChrisCooper提出的方法是不reli正如文件中所述。有些流不执行它,或返回近似结果(理论上,它仍然可以在还有一些数据时返回0,例如 - 网络流)。

因此,在看同一文档中,我们发现该特定块:

任何试图读取超过由相应writeObject方法写入的 自定义数据的边界的对象数据将导致 一个OptionalDataException到被抛出的eof字段值为true。 超出分配数据末尾的非对象读取将以 反映数据结束的方式与它们将指示流末尾的方式相同:字节读取将返回-1作为字节读取或 字节数读取和原始读取将抛出EOFException。如果 没有相应的writeObject方法,则默认的 序列化数据结束标记分配数据的结束。

所以,最好的办法是将捕获一个OptionalDataException并检查它的eof领域true

而且,以进一步消化了答案,这就是你想要的方式:

TransactionRecord readRecord(ObjectInputStream stream) throws OptionalDataException, IOException { 
    try { 
     transactionRecord = (TransactionRecord) stream.readObject(); 
    } catch (OptionalDataException e) { 
     if (e.eof) { 
      return null; 
     } else { 
      throw e; 
     } 
    } 
    return transactionRecord; 
} 
..... 
TransactionRecord record; 
while ((record = readRecord(inTrans)) != null) { 
    doSomethingWithRecord(record); 
} 
endOfFile(); 
相关问题