一次读取所有输入流

2022-09-02 04:43:42

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

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

在这种情况下,我可以编写此语法,因为我知道有固定数量的回复。但是如果我不知道行数,并且想一次读取整个输入流,我应该如何修改当前函数。下面是该函数的代码: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();
}

答案 1

Apache Commons IOUtils.readLines()呢

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

或者,如果您只想要单个字符串,请使用 IOUtiles.toString()。

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

[更新]根据关于这在J2ME上可用的评论,我承认我错过了这个条件,但是,IOUtils源代码在依赖关系上非常轻,所以也许可以直接使用代码。


答案 2

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

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;

推荐