Domanda

Sto utilizzando MIDP 2.0 (JSR 118) e ho appena notato che non esiste un lettore per stringhe in J2ME.

Qualcuno sa come dovresti leggere le stringhe da un InputStream o InputStreamReader in modo indipendente dalla piattaforma (ovvero tra due telefoni cellulari abilitati Java di diversi modelli)?

È stato utile?

Soluzione

In alternativa, dai un'occhiata a DataInputStream.readUTF () .

È richiesto che la stringa che viene letta da InputStream sia codificata in modo appropriato (come in un corrispondente DataOutputStream.writeUTF (String) ), quindi potrebbe non essere quello che stai cercando - ma funziona su diversi telefoni / modelli ecc.

Altri suggerimenti

Quale profilo stai usando? Il profilo MID in JSR 118 specifica InputStreamReader ( non StringReader, ma ciò non ti aiuterebbe comunque a leggere da un InputStream).

EDIT: per riflettere la modifica alla domanda :)

Usi InputStreamReader.read (char [], int, int) e quando hai letto tutto quello che vuoi, crea una nuova stringa da un array di caratteri. Se vuoi leggere una riga alla volta come faresti da BufferedReader, devi fondamentalmente implementare tu stesso la funzionalità di BufferedReader (mantenendo un buffer di caratteri "read ma not consumed") e continuare a leggere fino a quando non si interrompe una riga.

Beh ... so che è stato TANTO tempo fa.

Devi fare esattamente quello che ha detto John, ed è MOLTO semplice. Mi ci sono volute quasi 5 ore per capirlo la prima volta ...

Mi chiedo ancora perché j2ME non includa qualcosa di così essenziale come il metodo BufferedReader per i socket, non è come se i telefoni cellulari si schiantassero con esso ... e sì, non lo do il culo di un topo se la mia app viene eseguita 1 ms più lentamente di quanto dovrebbe.

(Sto solo per inserire il codice pertinente, suppongo che tu sappia come formare le classi e importare le librerie richieste)

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
    }
}

Come puoi vedere, il metodo is.read () bloccherà il thread fino a quando non verrà ricevuto un nuovo input dall'utente ONE BYTE ALLA VOLTA. Questo significa che se usi telnet per testare, ogni sequenza di tasti farà iterare il ciclo una volta, quindi, semplicemente concateniamo il carattere con il carattere in un StringBuffer fino a quando non viene ricevuto il carattere 13.

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

Spero che questo aiuti le persone a provare a fare un server socket su j2ME. Ho già realizzato una versione multithread completamente funzionante per Blackberry, nel caso qualcuno ne avesse bisogno.

Saresti in grado di fornire un esempio di questo?

Usi InputStreamReader.read (char [], int, int) e quando hai letto tutto quello che vuoi, crea una nuova stringa da un array di caratteri. Se vuoi leggere una riga alla volta come faresti da BufferedReader , devi fondamentalmente implementare tu stesso la funzionalità di BufferedReader (mantenendo un buffer di caratteri "letti ma non consumati") e continua a leggere fino a quando non raggiungi un'interruzione di linea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top