java - ¿Cómo leo cadenas en J2ME?
java-me network-programming (4)
¿Qué perfil estás usando? El perfil MID en JSR 118 especifica InputStreamReader (no StringReader, pero eso no le ayudaría a leer desde un InputStream de todos modos).
EDITAR: Para reflejar el cambio a la pregunta :)
Utiliza InputStreamReader.read (char [], int, int) y cuando haya leído todo lo que desea, cree 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 usted mismo (manteniendo un búfer de caracteres "leídos pero no consumidos") y seguir leyendo hasta que llegue a un salto de línea.
Estoy usando el MIDP 2.0 (JSR 118) y me acabo de dar cuenta de que no hay lector de 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)?
Alternativamente, eche un vistazo a DataInputStream.readUTF()
.
Requiere que la cadena que se lee del InputStream se codifique de manera apropiada (como por un DataOutputStream.writeUTF(String)
) correspondiente, por lo que puede no ser lo que estás buscando, pero funciona en diferentes teléfonos / modelos, etc.
Bueno ... sé que esto fue hace mucho tiempo.
Debes hacer exactamente lo que dijo John, y es MUY simple. Me tomó casi 5 horas descubrirlo la primera vez ...
Todavía me pregunto por qué j2ME no incluía algo tan esencial como el método BufferedReader
para sockets, no es que los malditos teléfonos celulares se bloqueen con él ... y sí, no me importa si mi aplicación corre 1 ms más lento que debería.
(Voy a poner el código correspondiente, supongo que sabes cómo formar clases e importar las bibliotecas necesarias)
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 A LA VEZ. Esto significa que si usa telnet para probar, cada pulsación de tecla hará que el bucle se repita una vez, por lo tanto, simplemente concatenamos char por char en un StringBuffer
hasta que se reciba el carácter 13.
System.out.println(sb.toString());
Espero que esto ayude a las personas que intentan hacer un servidor de socket en j2ME. Ya diseñé una versión multiproceso totalmente funcional de esto para blackberry, en caso de que alguien lo necesite.
¿Serías capaz de dar un ejemplo de esto?
Utiliza InputStreamReader.read(char[], int, int)
y cuando haya leído todo lo que desea, cree 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 usted mismo (manteniendo un búfer de caracteres "leídos pero no consumidos") y seguir leyendo hasta que llegue a un salto de línea.