2011-04-22 96 views
7

我开发了一个j2me应用程序,它通过套接字连接到我的虚拟主机服务器。我使用扩展了基本InputStreamReader的扩展lineReader类从服务器读取响应。如果服务器发送5行答复,通过线读取服务器答复线的语法是:一次读取inputStream

 line=input.readLine(); 
     line = line + "\n" + input.readLine(); 
     line = line + "\n" + input.readLine(); 
     line = line + "\n" + input.readLine(); 
     line = line + "\n" + input.readLine(); 

在这种情况下,因为我知道有答复的固定编号i可以写此语法。但是如果我不知道行数,并且想要一次读取整个inputStream,那么我应该如何修改当前的readLine()函数。以下是该功能的代码:

public String readLine() throws IOException { 
    StringBuffer sb = new StringBuffer(); 
    int c; 
    while ((c = read()) > 0 && c != '\n' && c != '\r' && c != -1) { 
     sb.append((char)c); 
    } 
    //By now, buf is empty. 
    if (c == '\r') { 
     //Dos, or Mac line ending? 
     c = super.read(); 
     if (c != '\n' && c != -1) { 
      //Push it back into the 'buffer' 
      buf = (char) c; 
      readAhead = true; 
     } 
    } 
    return sb.toString(); 
} 

回答

5

那么Apache Commons IOUtils.readLines()呢?

使用平台的默认字符编码获取InputStream的内容作为字符串列表,每行一个条目。

或者如果你只是想单个字符串使用IOUtiles.toString()

使用平台的默认字符编码获取InputStream的内容为String。

[更新]每注释这个是avaible J2ME的,我承认我错过了条件然而,IOUtils source是依赖非常轻,所以也许代码可以直接使用。

+0

但它可用于j2me平台吗? – 2011-04-22 01:43:09

+0

@ Coding-Freak:对不起,我错过了;我对J2ME平台有点无知,所以我用我所知道的最好的祝福更新了我的答案,祝你好运。 – 2011-04-22 01:46:30

+0

我只是想修改我目前正在使用的readLine()函数,以便能够一次读取整个流。希望你理解这个问题。 – 2011-04-22 01:52:09

1

如果我理解正确的话,你可以用一个简单的循环:

StringBuffer sb = new StringBuffer(); 
String s; 
while ((s = input.readLine()) != null) 
    sb.append(s); 

添加在你的循环计数器,如果你的计数器= 0,则返回null:

int counter = 0; 
while ((c = read()) > 0 && c != '\n' && c != '\r' && c != -1) { 
    sb.append((char)c); 
    counter++; 
} 
if (counter == 0) 
    return null; 
+0

我按照你的说法修改了代码。现在它返回从服务器没有响应。 – 2011-04-22 02:12:09

+0

这不是一个完整的例子。你应该添加一些EOF标志,如果-1已经收到,之后没有读取。 – MByD 2011-04-22 02:17:36

+0

请帮我解决其他问题。我完全沉迷于此。 :( – 2011-04-22 02:24:23

0

具体为Web服务器!

String temp; 
StringBuffer sb = new StringBuffer(); 
while (!(temp = input.readLine()).equals("")){ 
    sb.append(line); 
}