2011-04-22 7 views
7

He desarrollado una aplicación j2me que se conecta a mi servidor de alojamiento web a través de sockets. Leí las respuestas del servidor usando mi propia clase de lineReader extendida que amplía el InputStreamReader básico. Si el servidor envía 5 líneas de respuestas, la sintaxis para leer la línea de respuestas de servidor mediante la línea es:Lectura de un inputStream todo de una vez

 line=input.readLine(); 
     line = line + "\n" + input.readLine(); 
     line = line + "\n" + input.readLine(); 
     line = line + "\n" + input.readLine(); 
     line = line + "\n" + input.readLine(); 

En este caso, puedo escribir esta sintaxis porque sé que hay un número fijo de respuestas. Pero si no sé el número de líneas y quiero leer todo el inputStream a la vez, ¿cómo debo modificar la función actual readLine()? Aquí está el código de la función:

public String readLine() throws IOException { 
    StringBuffer sb = new StringBuffer(); 
    int c; 
    while ((c = read()) > 0 && c != '\n' && c != '\r' && c != -1) { 
     sb.append((char)c); 
    } 
    //By now, buf is empty. 
    if (c == '\r') { 
     //Dos, or Mac line ending? 
     c = super.read(); 
     if (c != '\n' && c != -1) { 
      //Push it back into the 'buffer' 
      buf = (char) c; 
      readAhead = true; 
     } 
    } 
    return sb.toString(); 
} 

Respuesta

5

¿Qué hay de Apache Commons IOUtils.readLines()?

Obtenga el contenido de un InputStream como una lista de cadenas, una entrada por línea, utilizando la codificación de caracteres predeterminada de la plataforma.

O si solo quiere una sola cadena use IOUtiles.toString().

Obtenga el contenido de un InputStream como una cadena utilizando la codificación de caracteres predeterminada de la plataforma.

[Actualización] Según el comentario de que esta es sito en J2ME, admito que perdí esa condición sin embargo, el IOUtils source es bastante luz sobre las dependencias, por lo que tal vez el código podría ser utilizado directamente.

+0

pero está disponible para la plataforma j2me? –

+0

@ Coding-Freak: lo siento, me lo perdí; Soy un tanto ignorante sobre la plataforma J2ME, así que actualicé mi respuesta con lo mejor que sé, buena suerte. –

+0

Solo quiero modificar mi función 'readLine()' actualmente en funcionamiento para poder leer todo el flujo de una sola vez. Espero que entiendas la pregunta. –

1

Si he entendido bien, usted puede utilizar un bucle simple:

StringBuffer sb = new StringBuffer(); 
String s; 
while ((s = input.readLine()) != null) 
    sb.append(s); 

añadir un contador en el bucle, y si su contador = 0, null volver:

int counter = 0; 
while ((c = read()) > 0 && c != '\n' && c != '\r' && c != -1) { 
    sb.append((char)c); 
    counter++; 
} 
if (counter == 0) 
    return null; 
+0

modifiqué el código como dijiste. ahora no devuelve respuesta del servidor. –

+0

Esto no es un ejemplo completo. Debería agregar alguna bandera EOF si -1 ha recibido y no leído después de eso. – MByD

+0

por favor ayúdenme con el código de descanso. estoy totalmente atascado con eso. :( –

0

Específicamente para el servidor web!

String temp; 
StringBuffer sb = new StringBuffer(); 
while (!(temp = input.readLine()).equals("")){ 
    sb.append(line); 
} 
Cuestiones relacionadas