2015-06-08 3 views
-1

Я в настоящее время готовятся к оценке вакансий, которые у меня есть. Таким образом, компания предоставила некоторые практические задания и их соответствующие решения.Хотя условия для десериализации нескольких объектов в Java

Я столкнулся с некоторой дилеммой о том, как десериализовать несколько объектов из файла Serialized.

Первоначально, когда я решал самостоятельно, изучив определения классов для FileInputStream и ObjectInputStream, я решил, что лучший способ достичь этого будет.

 FileInputStream fis = new FileInputStream(fileName);    
     ObjectInputStream ois = new ObjectInputStream(fis); 
     while(fis.available()!=0) 
     { 
      obj = (Show)ois.readObject(); 
      lst.add(obj); 
     } 
     ois.close(); 
     fis.close(); 

Но позже, когда я искал, я не нашел никого, предлагающего это, хотя это сработало отлично для меня. Решение этих компаний к уступке является

  in=new ObjectInputStream(new FileInputStream(fileName)); 
     Show s=null; 
     while((s=(Show)in.readObject())!=null){ 

      list.add(s); 
     } 

Но когда я пытаюсь использовать последнее решение в другой программе, это дает мне исключение

 FileInputStream fis = new FileInputStream(fileNameChannel); 
     ObjectInputStream ois = new ObjectInputStream(fis); 

     while((obj=(Channel) ois.readObject())!=null){ 
      list.add(obj); 
     } 
     fis.close(); 
     ois.close(); 

Исключение:

java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at com.psl.util.SetTopBoxManagementSystemImpl.populateByChannelCategory(SetTopBoxManagementSystemImpl.java:29) 
    at com.psl.main.Client.main(Client.java:18) 

Чтобы найти правильный ответ, я попробовал поиск через StackExchange и нашел, что люди действительно предлагали в ловле exce ption и Обработка его в сочетании с использованием While (true). - Link

Что я не мог понять, как

  1. Почему я не должен использовать fis.available()> 0? или, вернее, почему никто?
  2. Каковы могут быть возможные причины того, что одна и та же реализация приводит к исключению EOFException в одной программе, но не в другом? Поскольку оба извлекают все сериализованные объекты, присутствующие в файле Serialized.
  3. Почему я должен использовать while (true) и ловлю EOFException, если это возможно для меня таким образом, чтобы исключение не происходило, пока все в порядке? Это просто похоже на ярлык для достижения. Если что-то пойдет не так (EOF wise), как бы мы справились с этим?
+0

Возможно '' '' '' '' '' '' '' '' '' ', даже если мы еще не прочитали все нужные нам данные. Я думаю, что они могут писать нулевой объект, чтобы указать конец файла. – BevynQ

ответ

2
  1. readObject() не возвращает нуль в конце потока. Он может сделать это в любое время. Он возвращает null, если вы написали null. Поэтому вы не можете использовать это.
  2. available() == 0 не является испытанием для конца потока: см. Javadoc. Поэтому вы не можете использовать это.
  3. readObject() throws EOFException в конце потока. Так что используйте это.

Чтобы ответить на ваши вопросы:

Почему я не должен использовать fis.available()> 0?

Поскольку количество байтов, доступных для чтения без блокировки, не имеет никакого отношения к концу потока.

или, вернее, почему никому не нужен?

Потому что это не работает.

Каковы могут быть возможные причины того, что одна и та же реализация приводит к исключению EOFException в одной программе, но не в другом?

Один из них отправляется в нуль, чтобы указать конец потока. Это плохая практика, поскольку она мешает вам использовать null для чего-либо еще. Требуется значение вне диапазона. Действительно, неясно, что нуль делает здесь конец конца потока. Возможно, вы преждевременно прекратите чтение.

Почему я должен рассмотреть вопрос об использовании времени (правда) и ловить EOFException

Потому что это то, как API предназначен.

, если это возможно для меня таким образом, чтобы исключение не происходило, пока все в порядке?

Но все будет не так навсегда. Вы получите усеченные файлы, сброшенные соединения, ...

Это просто ярлык для достижения.

Это бессмысленно.

Если что-то пошло не так (EOF wise), как бы мы справились с этим?

Поймать исключение.

+0

Чтобы быть справедливым, способ разработки API ... отстой. Это немного похоже на те старые, заблокированные вопросы о SO. 'Этот API существует, потому что он имеет историческое значение, но он не считается хорошим API-интерфейсом для данного языка, поэтому, пожалуйста, не используйте его в качестве доказательства того, что вы должны написать аналогичные API-интерфейсы. Этот API и его реализации заморожены и не могут быть изменены. ' – jaco0646

+0

@ jaco0646 Мусор. Другого пути, возможно, не было спроектировано. Требуется внеполосное значение, а исключение - единственный способ обеспечить, что при возврате объекта. И не используйте форматирование кода для текста, который не является кодом. Если он предназначен для цитаты, предоставьте правильную цитату. И, пожалуйста, предоставьте цитату из вашего утверждения о том, что «этот API и его реализации заморожены». – EJP

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