2009-10-01 14 views
5

Używam ObjectInputStream do wywoływania readObject do odczytu w postaci szeregowej Objects. Chciałbym uniknąć tego bloku metod, więc zamierzam użyć czegoś takiego jak Inputstream.available().Serializacja Java, ObjectInputStream.readObject(), sprawdź, czy blokuje

InputStream.available() powie Ci, że są dostępne bajty i że read() nie będzie blokować. Czy istnieje odpowiednia metoda do seriilizacji, która powie ci, czy są dostępne Object s, a readObject nie będzie blokować?

Odpowiedz

6

Nie. Chociaż można użyć ObjectInputStream w innym wątku i sprawdzić, czy ma to obiekt dostępny. Generalnie polling nie jest świetnym pomysłem, szczególnie ze słabymi gwarancjami InputStream.available.

4

Interfejs API do serializacji Java nie został zaprojektowany do obsługi funkcji available(). Jeśli zaimplementujesz własne funkcje odczytu/zapisu obiektów, możesz odczytać dowolną ilość danych ze strumienia, który Ci się podoba, i nie ma metody raportowania.

Tak więc readObject() nie wie, ile danych będzie czytać, więc nie wie, ile obiektów jest dostępnych.

Jak sugerował inny post, najlepiej jest przenieść czytanie do oddzielnego wątku.

0

Mam pomysł, że poprzez dodanie kolejnego InputStream do łańcucha można udostępniać informacje o dostępność czytelny przez klienta:

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(); 
} 

Punktem trudne jest wartość N. Należy wystarczająco duże, aby pokryć zarówno dane nagłówka i serializacji obiektu. Jeśli te różnią się szalenie, nie ma szczęścia.

+1

Jeśli w ogóle się różnią, możesz stracić dużą. Jeśli wybierzesz N, który jest większy od następnego obiektu, możesz przejść do stanu zakleszczenia, w którym oczekujesz więcej niż bieżący obiekt, a nadawca nie wyśle ​​następnego obiektu, dopóki nie odpowiesz na poprzednie. . Lepiej upewnić się, że przed użyciem tego podejścia istnieje nieskończona ilość danych wejściowych! – PanCrit

0

BufferedInputStream działa dla mnie i dlaczego nie sprawdzić, czy (bis.available()> 0) zamiast wartości N, działa to idealnie dla mnie. Myślę, że ObjectInputStream.readObject bloki (= czeka aż), gdy nie ma danych wejściowych do odczytu. Jeśli w strumieniu występują jakieś dane wejściowe, to jeśli (bis.available()> 0) ObjectInputStream.readObject nie będzie blokować. Należy pamiętać, że obiekt ObjectInputStream.readObject może generować wyjątek ClassNotFoundException i nie stanowi to dla mnie żadnego problemu.

Powiązane problemy