Сериализация Java, ObjectInputStream.readObject (), проверьте, будет ли блокироваться - PullRequest
5 голосов
/ 01 октября 2009

Я использую ObjectInputStream для вызова readObject для чтения в сериализованном Objects. Я бы хотел, чтобы этот метод не использовался, поэтому я хочу использовать что-то вроде Inputstream.available().

InputStream.available() сообщит вам, что есть доступные байты и что read() не будет блокироваться. Существует ли эквивалентный метод сериализации, который сообщит вам, если есть Object s и readObject не заблокирует?

Ответы [ 4 ]

7 голосов
/ 01 октября 2009

Нет. Хотя вы можете использовать ObjectInputStream в другом потоке и проверить, есть ли в нем доступный объект. Вообще опрос не очень хорошая идея, особенно с плохими гарантиями InputStream.available.

4 голосов
/ 01 октября 2009

API сериализации Java не был разработан для поддержки функции available(). Если вы реализуете свои собственные функции чтения / записи объектов, вы можете читать любой объем данных из потока, который вам нравится, и нет никакого метода отчетности.

То есть readObject() не знает, сколько данных он будет читать, поэтому он не знает, сколько объектов доступно.

Как и предполагалось в другом посте, лучше всего перенести чтение в отдельную ветку.

0 голосов
/ 29 июня 2011

BufferedInputStream работает для меня, и почему бы просто не проверить, если (bis.available ()> 0) вместо значения N, это прекрасно работает для меня. Я думаю, что ObjectInputStream.readObject блокирует (= ждет до), когда никакой вход не должен быть прочитан. Поэтому, если в потоке вообще есть какие-либо входные данные, иначе if (bis.available ()> 0) ObjectInputStream.readObject не будет блокироваться. Имейте в виду, что ObjectInputStream.readObject может вызвать исключение ClassNotFoundException, и для меня это не проблема.

0 голосов
/ 01 октября 2009

У меня есть идея, что, добавив еще один InputStream в цепочку, можно сделать информацию о доступности читаемой клиентом:

HACK!

InputStream is = ... // where we actually read the data
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);

if( bis.available() > N ) {
  Object o = ois.readObject();
}

Хитрый момент - это значение N. Оно должно быть достаточно большим, чтобы охватить как заголовок сериализации, так и данные объекта. Если они сильно различаются, не повезло.

...