Pergunta

Eu estou usando o MIDP 2.0 (JSR 118) e eu só notei que não há leitor para cordas em J2ME.

Alguém sabe como você é suposto para ler Cordas de um InputStream ou InputStreamReader de uma forma independente de plataforma (ou seja, entre duas java habilitado telefones celulares de diferentes modelos)?

Foi útil?

Solução

Como alternativa ter um olhar para DataInputStream.readUTF() .

se necessário que o ser cadeia li fora do InputStream ser codificado de forma adequada (como em por um correspondente DataOutputStream.writeUTF(String) ) por isso não pode ser o que você está procurando - mas trabalha em diferentes telefones / modelos etc.

Outras dicas

Qual o perfil que você está usando? O perfil MID no JSR 118 especifica InputStreamReader ( não StringReader, mas que não iria ajudá-lo a ler de um InputStream de qualquer maneira).

EDIT: Para refletir a mudança para a pergunta:)

Você usa InputStreamReader.read (char [], int, int) e quando você já leu tudo que você quer, criar uma nova cadeia a partir de uma matriz de char. Se você quiser ler uma linha de cada vez como se fosse a partir BufferedReader, basicamente você precisa para implementar a funcionalidade de BufferedReader si mesmo (mantendo um buffer de "ler, mas não consumida" caracteres) e manter a leitura até que você bata uma quebra de linha.

Bem ... eu sei que este foi um longo tempo atrás.

Você precisa fazer exatamente o que John disse, e é muito simples. Ele quase me levou 5 horas para descobrir isso pela primeira vez ...

Ainda me pergunto por que J2ME não incluir algo tão essencial como o método BufferedReader para sockets, não é como os telefones celulares do freakin irá travar com ele ... e sim, eu não dou a mínima se o meu aplicativo é executado 1ms mais lento do que deveria.

(Eu só vou colocar o código relevante, eu suponho que você sabe como formar aulas e importar as bibliotecas necessárias)

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 você pode ver, o método is.read() irá travar o fio até nova entrada é recebida do usuário um byte de cada vez. Isto significa que se você usar o Telnet para teste, cada tecla fará com que o loop iterate uma vez, portanto, nós caractere simplesmente concatenar por caractere em uma StringBuffer até caractere 13 é recebido.

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

Espero que isso ajude as pessoas tentando fazer um servidor de soquete com o J2ME. Eu já trabalhada uma versão multithreaded totalmente funcional desta para a amora, no caso de alguém precisa.

Você seria capaz de fornecer um exemplo disso?

Você usa InputStreamReader.read(char[], int, int) e quando você já leu tudo que você quer, criar uma nova cadeia a partir de uma matriz de char. Se você quiser ler uma linha de cada vez como se fosse a partir BufferedReader, basicamente você precisa para implementar a funcionalidade de BufferedReader si mesmo (mantendo um buffer de "ler, mas não consumida" caracteres) e manter a leitura até que você bata uma quebra de linha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top