如何在J2ME中读取字符串?

时间:2008-10-14 07:20:51

标签: java java-me network-programming midp

我正在使用MIDP 2.0(JSR 118),我只是注意到J2ME中没有读取器的字符串。

有没有人知道你应该如何以独立于平台的方式从InputStreamInputStreamReader读取字符串(即两个不同型号的java手机之间)?

4 个答案:

答案 0 :(得分:5)

您使用的是哪种个人资料? JSR 118中的MID配置文件指定InputStreamReader(不是StringReader,但无论如何都无法帮助您从InputStream读取)。

编辑:反映问题的变化:)

您使用InputStreamReader.read(char [],int,int),当您阅读完所有内容时,请从char数组创建一个新字符串。如果你想像BufferedReader那样一次读取一行,你基本上需要自己实现BufferedReader的功能(保持一个“读但未消耗”的缓冲区)并继续阅读,直到你遇到换行符。 / p>

答案 1 :(得分:3)

或者看看DataInputStream.readUTF()

它确实需要对从InputStream读取的字符串进行适当的编码(如相应的DataOutputStream.writeUTF(String)所示),因此它可能不是您正在寻找的 - 但它确实适用于不同的手机/型号等

答案 2 :(得分:3)

嗯......我知道这是很久以前的事了。

你需要完全按照约翰的说法去做,而且非常简单。我第一次花了5个小时来计算这个......

我仍然想知道为什么j2ME没有像套接字的BufferedReader方法那样包含一些必要的东西,它不像那个怪异的手机会崩溃...而且,是的,我不会给老鼠的屁股如果我的应用程序比它应该慢1ms。

(我只是要提供相关代码,我假设您知道如何构建类并导入所需的库)

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

正如您所看到的,is.read()方法将锁定线程,直到用户收到来自ONE BYTE AT TIME的新输入。这意味着如果你使用telnet进行测试,每次击键都会使循环迭代一次,因此,我们只需在StringBuffer中通过char连接char,直到收到char 13。

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

我希望这有助于人们尝试在j2ME上执行套接字服务器。我已经为黑莓制作了一个功能齐全的多线程版本,以防万一有需要。

答案 3 :(得分:1)

你能提供一个这方面的例子吗?

您使用InputStreamReader.read(char[], int, int)并在阅读完所有内容后,从char数组中创建一个新字符串。如果你想像BufferedReader那样一次读一行,你基本上需要自己实现BufferedReader的功能(保持一个“读但未消耗”的缓冲区)并继续阅读直到你找到一个换行。