Question

J'utilise le MIDP 2.0 (JSR 118) et je viens de remarquer qu'il n'y a pas de lecteur de chaînes dans J2ME.

Quelqu'un sait-il comment vous êtes censé lire Strings à partir d'un InputStream ou d'un InputStreamReader de manière indépendante de la plate-forme (c'est-à-dire entre deux téléphones cellulaires de modèles différents compatibles Java activés)?

Était-ce utile?

La solution

Vous pouvez également consulter DataInputStream.readUTF () .

Il est nécessaire que la chaîne en cours de lecture dans InputStream soit correctement codée (comme dans un DataOutputStream.writeUTF (Chaîne) ) afin que ce ne soit peut-être pas ce que vous recherchez - mais cela fonctionne sur différents téléphones / modèles, etc.

Autres conseils

Quel profil utilisez-vous? Le profil MID dans JSR 118 spécifie InputStreamReader ( pas StringReader, mais cela ne vous aiderait pas de toute façon à lire depuis un InputStream).

EDIT: pour refléter le changement apporté à la question:)

Vous utilisez InputStreamReader.read (char [], int, int) et lorsque vous avez lu tout ce que vous voulez, créez une nouvelle chaîne à partir d'un tableau de caractères. Si vous souhaitez lire une ligne à la fois comme dans BufferedReader, vous devez implémenter vous-même les fonctionnalités de BufferedReader (en gardant une mémoire tampon de caractères "lus mais non consommés") et continuez à lire jusqu'à ce que vous sautiez à la ligne.

Eh bien ... je sais que c'était il y a très longtemps.

Vous devez faire exactement ce que John a dit, et c’est TRÈS simple. Il m'a fallu presque 5 heures pour comprendre celui-ci la première fois ...

Je me demande toujours pourquoi j2ME n'a pas inclus quelque chose d'aussi essentiel que la méthode BufferedReader pour les sockets, ce n'est pas comme si les téléphones portables foutaient en panne avec elle ... et oui, je ne donne pas le cul d'un rat si mon application fonctionne 1ms plus lent qu'il ne le devrait.

(Je vais juste mettre le code approprié, je suppose que vous savez former des classes et importer les bibliothèques requises)

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

Comme vous pouvez le constater, la méthode is.read () verrouille le thread jusqu'à ce qu'une nouvelle entrée soit reçue de l'utilisateur ONE BYTE AT A TIME. Cela signifie que si vous utilisez telnet pour tester, chaque frappe de touche fera la boucle itérer une fois. Par conséquent, nous concaténons simplement caractère par caractère dans un StringBuffer jusqu'à la réception du caractère 13.

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

J'espère que cela aidera les personnes essayant de créer un serveur de socket sur j2ME. J'avais déjà conçu une version multithread entièrement fonctionnelle pour BlackBerry, au cas où quelqu'un en aurait besoin.

Seriez-vous en mesure de fournir un exemple?

Vous utilisez InputStreamReader.read (char [], int, int) et, lorsque vous avez tout lu, créez une nouvelle chaîne à partir d'un tableau de caractères. Si vous voulez lire une ligne à la fois comme dans BufferedReader , vous devez en principe implémenter vous-même les fonctionnalités de BufferedReader (en gardant un tampon de "lu mais non consommé") et continuez à lire. jusqu'à ce que vous atteigniez un saut de ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top