Чтение из InputStream в нескольких форматах - PullRequest
6 голосов
/ 15 февраля 2011

Я пытаюсь написать класс, который читает HTTP-запросы и ответы и анализирует их.Поскольку заголовки представляют собой обычный текст, читать их проще всего с помощью метода BufferedReader и readLine .Это, очевидно, не подходит для тела данных, поскольку оно может быть двоичным, поэтому я хочу переключиться на чтение необработанных байтов после того, как заголовки были прочитаны.

Сейчас я делаю что-то вроде этого:

InputStream input=socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(input));
BufferedInputStream binstream=new BufferedInputStream(input);

Проблема в том, что BufferedReader читает вперед и поглощает все двоичные данные из потока, прежде чем у меня есть шанс добраться до него с помощью binstream.

Есть ли способ запретить чтение за пределами новой строки для каждого вызова readLine ?Или есть ли лучший способ прочитать отдельные строки текста ASCII с последующими необработанными двоичными данными?

Ответы [ 3 ]

5 голосов
/ 15 февраля 2011

Если вы не хотите использовать готовую реализацию клиент / сервер HTTP, как предложил Константин, DataInputStream имеет метод readLine. Это устарело, так как оно не выполняет правильное преобразование (в основном, прямое преобразование байтов -> преобразование символов), но я думаю, что для чистых строк заголовка ASCII вы должны быть хорошими.

(Вы должны поместить BufferedInputStream под свой DataInputStream, поскольку readLine читает каждый байт по отдельности.)

5 голосов
/ 15 февраля 2011

В Java уже есть класс для обработки HTTP-запросов и ответов.Вы должны использовать это вместо того, чтобы пытаться разобрать ответ самостоятельно.Парсинг HTTP-ответа сложнее, чем вы думаете, поскольку есть разные методы кодирования, с которыми вам приходится иметь дело.Это не совсем необработанные двоичные данные в ответной нагрузке.Класс HttpURLConnection проанализирует для вас заголовки и предоставит вам InputStream для полезной нагрузки.

http://download.oracle.com/javase/1.4.2/docs/api/java/net/HttpURLConnection.html

2 голосов
/ 15 февраля 2011

commons-httpclient может сэкономить вам кучу работы здесь.

...