Получение прогресса ObjectOutputStream / ObjectInputStream - PullRequest
0 голосов
/ 20 марта 2011

Недавно я выяснил, как использовать ObjectOutputStream и ObjectInputStream для отправки объектов через простое соединение через сокет Java между сервером и клиентом. Мне было интересно, если бы я хотел передать объект, который может быть большим по размеру, например, изображение, можно ли поставить поток, который отслеживает прогресс, сколько данных было отправлено / получено? Если ответ на этот вопрос не очень прямой, может ли кто-нибудь объяснить, как я могу сделать что-то подобное? Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 20 марта 2011

Библиотека ввода-вывода Apache Commons имеет пару классов CountingInputStream и CountingOutputStream, которые реализуют байтовые счетные фильтры потока ввода / вывода.

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

Вы можете реализовать то же самое самостоятельно, создав подклассы FilterInputStream и FilterOutputStream классы.И даже есть класс Swing под названием ProgressMonitorInputStream, который может реализовать именно то, что вам нужно.

0 голосов
/ 20 марта 2011

Я бы предложил написать инструментированные InputStream и OutputStream, которые просто передают / отправляют потоки, предоставленные во время построения, при подсчете количества проходящих байтов.

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

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

...