Lee de InputStream en múltiples formatos

Estoy intentando escribir una clase que lee solicitudes y respuestas HTTP y las analiza. Dado que los encabezados son texto ordinario, parecía más fácil leerlos usando un BufferedReader y el método readLine . Obviamente, esto no sirve para el cuerpo de datos, ya que puede ser binario, por lo que quiero cambiar para leer bytes sin procesar una vez que se hayan leído los encabezados.

En este momento, estoy haciendo algo como esto:

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

El problema es que el BufferedReader está leyendo con anticipación y engullendo todos los datos binarios de la secuencia antes de que tenga la oportunidad de acceder a ella con binstream.

¿Hay alguna forma de evitar que lea más allá de la nueva línea para cada llamada a readLine ? ¿O hay una mejor manera de leer líneas simples de texto ASCII seguidas de datos binarios sin procesar?

Ya existe una clase en Java para manejar solicitudes y respuestas HTTP. Deberías usar eso en lugar de intentar analizar la respuesta por tu cuenta. Analizar la respuesta HTTP es más difícil de lo que cree, ya que hay diferentes métodos de encoding con los que tiene que lidiar. No se trata realmente de datos binarios sin procesar en la carga útil de respuesta. La clase HttpURLConnection analizará los encabezados por usted y le dará InputStream para la carga útil.

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

Si no desea utilizar una implementación de cliente / servidor HTTP preparada como la propuesta por Konstantin, DataInputStream tiene un método readLine . Está en desuso ya que no está realizando una conversión adecuada (principalmente una conversión de conversión de caracteres de byte directo), pero creo que para las líneas de encabezado ASCII puras debería ser bueno.

(Debería poner un BufferedInputStream debajo de su DataInputStream, ya que readLine lee cada byte individualmente).

commons-httpclient puede ahorrarle un montón de trabajo aquí.