0

とにかく、クラス 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
4

2 に答える 2

2

最良のアイデアは、要素の数を事前にシリアル化することです。そのため、次のようにすることができます。

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

ドキュメントに記載されているように、@ChrisCooper によって提案された方法は信頼できません。一部のストリームはそれを実装していないか、おおよその結果を返します (理論的には、まだデータがある場合でも 0 を返すことがあります。例 - ネットワーク ストリーム)。

したがって、同じドキュメントを見ると、次の特定のブロックが見つかります。

対応する writeObject メソッドによって書き込まれたカスタム データの境界を超えるオブジェクト データを読み取ろうとすると、eof フィールド値が true の OptionalDataException がスローされます。割り当てられたデータの終わりを超える非オブジェクト読み取りは、ストリームの終わりを示すのと同じ方法でデータの終わりを反映します。バイト単位の読み取りは、読み取りバイトまたは読み取りバイト数として -1 を返し、プリミティブです。読み取りは EOFExceptions をスローします。対応する writeObject メソッドがない場合、デフォルトのシリアル化されたデータの最後が、割り当てられたデータの最後になります。

したがって、最良のアイデアは、 をキャッチして、そのフィールドOptionalDataExceptionの をチェックすることです。eoftrue

そして、答えをさらに消化するために、ここにあなたが望む方法があります:

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();
于 2013-03-05T11:59:47.883 に答える
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
}
于 2013-03-05T11:56:44.900 に答える