2009-11-25 7 views
2

В настоящее время я использую ObjecInputStream читать из Socket, и все прекрасно работает, используя этот простой код:отменить чтения из InputStream

ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); 
Object response = input.readObject(); 

Теперь я хочу, чтобы как-то отменить чтение, не закрывая поток , так что я могу позже прочитать его снова. Является ли это возможным?

Редактировать: Я хочу отменить чтение только потому, что он блокирует поток программы. Мне не нужно читать одну и ту же информацию дважды. Я просто хочу отменить его, чтобы отправить другой запрос, а затем прочитать (другой) ответ.

+1

У меня создается впечатление, что существует более чем один способ интерпретировать ваш вопрос на основе ответов до сих пор. Вы хотите отменить readObject() [потому что он заблокирован] и иметь возможность вызвать его позже? Или другие плакаты правильно привязали его, и вы просто ищете способ отбросить поток назад (хотя вам все равно придется найти способ вырваться из readObject()). – PSpeed

+0

Спасибо PSpeed, см. Мое обновление :) – phunehehe

ответ

2

Если у вас есть какая-то «основная» нить, вам следует выполнить отключение ввода-вывода. У вас есть поток, посвященный чтению, а также некоторые расширения обработки ввода. Либо поставите результаты в основной поток, если на основе событий, измените модель, если используете общий проект состояния.

2

Посмотрите, что возвращает ObjectInputStream.markSupported(). Если он вернется true, вы можете позвонить в ObjectInputStream.mark() в начале, а затем позвонить ObjectInputStream.reset(), чтобы перемотать InputStream обратно на место, которое вы отметили, чтобы его можно было повторно использовать позже.

+0

то, что делать, если он возвращает false? BTW Я не хочу читать одни и те же данные дважды, я просто хочу отменить чтение, чтобы я мог отправить другой запрос, а затем прочитать другой ответ. – phunehehe

+0

@phunehehe: Если он возвращает 'false', то этот знак/сброс не поддерживается этим' InputStream', и эта стратегия не будет работать для вас. В любом случае, если вы не перечитываете одни и те же данные дважды (не упоминается в исходном вопросе), тогда стратегия не будет применяться в любом случае. Почему бы вам просто не создать новый «ObjectInputStream»? В наши дни создание экземпляров является дешевым. – Asaph

+0

Но программа блокирует, когда я делаю другой вызов 'input = new ObjectInputStream (socket.getInputStream()):' Я думаю, что это проблема со старым потоком (на самом деле, я думаю, что это тот же поток из одного и того же сокета) , Должен ли я создать другой сокет? – phunehehe

1

Для этого вы можете использовать PushBackInputStream. После прочтения некоторых байтов вы можете прочесть байты.

+0

Спасибо, см. Мое редактирование – phunehehe

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

  • Нет связанных вопросов^_^