2014-02-09 3 views
1

Я пытался выяснить, почему метод, который я написал для чтения объектов из файла, не работал и понял, что метод available() ObjectInputStream дал 0, хотя файл не был полностью прочитан. Метод работал после того, как я использовал метод FileInputStream available() вместо определения EOF, и он сработал!Метод ObjectInputStream available() не работает должным образом (Java)

Почему этот метод не работает для ObjectInputStram, когда он работает для FileInputStream?

Вот код:

public static void getArrFromFile() throws IOException, ClassNotFoundException { 
    Product p; 
    FileInputStream in= new FileInputStream(fName); 
    ObjectInputStream input= new ObjectInputStream(in); 
    while(in.available()>0){ 
     p=(Product)input.readObject(); 
     if (p.getPrice()>3000) 
      System.out.println(p); 
    } 
    input.close(); 

P.S- Я читал, что я должен использовать исключения EOF вместо доступны() для этого, но я просто хочу знать, почему это не работает.

Большое спасибо !!!

ответ

1

Метод available() просто указывает, сколько байтов может быть прочитано без блокировки. Это не очень полезно в обычном коде, но люди видят имя и ошибочно считают, что он делает что-то еще.

Итак, вкратце: не используйте available(), это неправильный способ использования. Потоки указывают, что заканчиваются по-разному, например, возврат -1 или в случае ObjectInputStream, бросая EOFException.

3

Поскольку, как сообщает javadoc, available() возвращает оценку количества байтов, которые могут быть прочитаны без блокировки. Базовая реализация InputStream всегда возвращает 0, потому что это допустимая оценка. Но что бы это ни возвратило, тот факт, что он возвращает 0, не означает, что читать больше нечего. Только то, что поток не может гарантировать, что по крайней мере один байт может быть прочитан без блокировки.

+0

Спасибо за ответ, но все же я не вижу разницы. Почему этот метод не работает для ObjectInputStram, пока он работает для FileInputStream? – Mapisto

+0

Поскольку по какой-либо причине ObjectInputStream не может гарантировать (или не предлагать такую ​​гарантию), что некоторые байты могут быть прочитаны без блокировки, тогда как FileInputStream может. Вам нужно было бы погрузиться в код этих двух классов, чтобы точно понять, что делает их класс доступных(). Но это довольно бесполезно, поскольку доступный() почти никогда не бывает полезен и, конечно же, не в этом случае. –

1

Хотя это не задокументировано ясно, я понял из опыта, что он связан с динамическими данными. Если ваш класс содержит только статически типизированные данные, то available() способен оценить размер. Если в вашем объекте есть динамические данные, например списки и т. Д., Это невозможно сделать.

+0

Добро пожаловать в StackOverflow! Просьба представить комментарии по вопросам, а не как прямой ответ. – Rafael

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