3

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

有谁知道您应该如何从独立于平台的方式(即在两个不同型号的启用 java 的手机之间)读取InputStream字符串InputStreamReader

4

4 回答 4

5

您使用的是哪个配置文件?JSR 118 中的 MID 配置文件指定了InputStreamReader(不是 StringReader,但无论如何这无助于您从 InputStream 中读取数据)。

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

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

于 2008-10-14T07:24:03.810 回答
3

或者看看DataInputStream.readUTF()

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

于 2008-10-14T10:22:20.160 回答
3

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

你需要完全按照约翰所说的去做,而且非常简单。我第一次弄明白这个几乎花了我 5 个小时...

我仍然想知道为什么 j2ME 没有包含像BufferedReader套接字方法那样重要的东西,这不像是该死的手机会因此而崩溃......是的,如果我的应用程序运行速度比它慢 1 毫秒,我不会在乎应该。

(我只是把相关代码放上去,我假设你知道如何形成类和导入所需的库)

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()方法将锁定线程,直到从用户一次一个字节接收到新输入。这意味着如果您使用 telnet 进行测试,则每次击键都会使循环迭代一次,因此,我们只需在 a 中将 char 逐个连接,StringBuffer直到收到 char 13。

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

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

于 2011-10-19T13:38:04.860 回答
1

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

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

于 2008-11-04T06:00:00.997 回答