2013-03-05 3 views
0

в любом случае, чтобы проверить, закончен ли метод readObject класса 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

Лучшая идея будет сериализовать количество элементов заранее, так что вы могли бы просто do:

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

Метод, предложенный @ChrisCooper, не является релевантным как указано в документации. Некоторые потоки не реализуют его или возвращают приблизительный результат (теоретически он может даже вернуть 0, когда еще есть данные. Пример - сетевой поток).

Поэтому, глядя на то же документации, мы находим этот конкретный блок:

Любая попытка чтения данных объекта, которая превышает границы пользовательских данных, записанных с помощью соответствующего метода writeObject вызовет OptionalDataException к быть выброшенным с истинным значением поля true. Необъектные чтения, которые превышают конец выделенных данных, будут отражать конец данных так же, как они указывают на конец потока : пошаговые чтения возвращают -1 в качестве байта или количество байтов read, а примитивные чтения будут вызывать EOFExceptions. Если не существует соответствующего метода 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(); 
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 
} 
+0

вы пропустили(): D в любом случае большое спасибо. – Kareem

+1

Исправлено. Благодарю. :) –

Смежные вопросы