Как удалить буферизованные данные в буферизованном OutputStream? - PullRequest
1 голос
/ 29 июля 2011

Можно пропустить данные из InputStream

in.skip (in.available ());

, но если вы хотите сделать что-то подобное сOutputStream Я обнаружил,

socket.getOutputStream (). Flush ();

Но это не то же самое, flush будет передавать буферизованные данные вместо их игнорирования.

Есть ли возможность удаления буферизованных данных?

Спасибо

РЕДАКТИРОВАТЬ

Ситуация клиент-серверное приложение,когда отправляется новая команда (от клиента), она (пытается) убедиться, что прочитанный ответ будет соответствовать последней отправленной команде.

Некоторые команды отправляются с помощью (запускаемых человеком) событий, а другие -отправлено автоматическиЕсли команда находится в буфере, а новая отправляется, то ответ будет для первого, что приведет к десинхронизации.

Конечно, синхронизированный метод плюс флаг под названием "waitCommand" может быть более безопасным, но, посколькусвязь ненадежна, этот подход медленный (зависит от времени ожидания).Вот почему я попросил метод пропуска.

Ответы [ 6 ]

3 голосов
/ 29 июля 2011

Вы не можете удалить данные, которые могли отправить.Вы можете записать данные в OutputStream в памяти, например, ByteArrayOutputStream, и копировать только те части, которые вам нужны.

2 голосов
/ 29 июля 2011

Я не уверен, имеет ли это смысл, но вы можете попробовать:

class MyBufferedOutputStream extends java.io.BufferedOutputStream {

    public MyBufferedOutputStream(OutputStream out) {
        super(out);
    }

    /** throw away everything in a buffer without writing it */
    public synchronized void skip() {
        count = 0; 
    }

}
2 голосов
/ 29 июля 2011

Что значит «пропускать» вывод данных?

Как только данные находятся в буфере, нет никакого способа вернуть их или удалить.Я предлагаю проверить, хотите ли вы пропустить данные до , вы записываете их в OutputStream.Либо так, либо ваш собственный вторичный буфер, который вы можете изменить по своему желанию.

1 голос
/ 30 июля 2011

Этот вопрос не имеет никакого смысла. Отбрасывание ожидающих запросов только усугубит проблему с протоколом приложения. Что происходит с парнем, который ждет ответа на удаленный запрос? Что случилось с функциональностью, которую должен был реализовать этот запрос? Вам нужно переосмыслить все это с другой точки зрения. Если у вас есть одно соединение с сервером, который выполняет транзакции запроса / ответа для этого клиента, протокол уже является последовательным. Вы должны будете синхронизироваться, например, на сокет в точке написания и очистки запроса и чтения ответа, но при этом вы не теряете никакой производительности, так как обработка на другом конце все равно секвенируется. Вам также не нужен флаг waitCommand, только синхронизация.

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

Лучшее, что вы можете сделать, чтобы "игнорировать" выходные данные, - это не записывать их сначала.

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

Поскольку вы управляете данными, записанными в OutputStream, просто не пишите фрагменты, которые вам не нужны. OutputStream по контракту не гарантирует, когда данные действительно записываются, поэтому нет смысла использовать метод пропуска.

...