Pregunta

Estoy usando el MIDP 2.0 (JSR 118) y acabo de notar que no hay lector para cadenas en J2ME.

¿Alguien sabe cómo se supone que debe leer cadenas de un InputStream o InputStreamReader de una manera independiente de la plataforma (es decir, entre dos teléfonos celulares habilitados para Java de diferentes modelos)?

¿Fue útil?

Solución

También puede consultar DataInputStream.readUTF () .

Requiere que la cadena que se lee fuera de InputStream se codifique adecuadamente (como por un DataOutputStream.writeUTF (String) ) por lo que podría no ser lo que está buscando pero funciona en diferentes teléfonos / modelos, etc.

Otros consejos

¿Qué perfil estás usando? El perfil MID en JSR 118 especifica InputStreamReader ( no StringReader, pero eso no te ayudaría a leer de un InputStream de todos modos).

EDITAR: Para reflejar el cambio a la pregunta :)

Utiliza InputStreamReader.read (char [], int, int) y cuando hayas leído todo lo que quieras, crea una nueva cadena a partir de una matriz char. Si desea leer una línea a la vez como lo haría con BufferedReader, básicamente necesita implementar la funcionalidad de BufferedReader (manteniendo un búfer de "leer pero no consumir" caracteres) y seguir leyendo hasta que llegue a un salto de línea.

Bueno ... Sé que esto fue hace mucho tiempo.

Necesitas hacer exactamente lo que dijo John, y es MUY simple. Casi tardé 5 horas en resolver esto la primera vez ...

Todavía me pregunto por qué j2ME no incluyó algo tan esencial como el método BufferedReader para sockets, no es como si los teléfonos celulares se estrellaran con él ... y sí, no doy el culo de una rata si mi aplicación se ejecuta 1 ms más lento de lo que debería.

(Solo voy a poner el código relevante, asumo que sabes cómo formar clases e importar las bibliotecas requeridas)

ServerSocketConnection listener
    = (ServerSocketConnection)Connector.open("socket://:1235");
System.out.println("Waiting for connection...");
StreamConnection server = listener.acceptAndOpen();
InputStream is = server.openInputStream();

//Now comes the fake BufferedReader equivalent part

int ch = 0;
StringBuffer sb = new StringBuffer();

while ((ch = is.read()) != -1){
    sb.append((char)ch);
    if(sb.charAt(sb.length()-1) == 13 ) {
       //Carriage return was received or ENTER was pressed
       break; //Exit loop and print input
    }
}

Como puede ver, el método is.read () bloqueará el hilo hasta que se reciba una nueva entrada del usuario ONE BYTE AT A TIME. Esto significa que si utiliza telnet para probar, cada pulsación hará que el bucle se repita una vez, por lo tanto, simplemente concatenaremos char por char en un StringBuffer hasta que se reciba el char 13.

System.out.println(sb.toString());

Espero que esto ayude a las personas que intentan hacer un servidor de socket en j2ME. Ya he creado una versión multiproceso completamente funcional de esto para Blackberry, en caso de que alguien lo necesite.

¿Podrías dar un ejemplo de esto?

Utiliza InputStreamReader.read (char [], int, int) y cuando hayas leído todo lo que quieras, crea una nueva cadena a partir de una matriz char. Si desea leer una línea a la vez como lo haría desde BufferedReader , básicamente necesita implementar la funcionalidad de BufferedReader (manteniendo un búfer de "leer pero no consumido" y seguir leyendo) hasta que llegues a un salto de línea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top