一次性读取输入流

22

我开发了一个J2ME应用程序,通过套接字连接到我的Web托管服务器。我使用自己扩展的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();
在这种情况下,我可以编写这个语法,因为我知道回复的数量是固定的。但是如果我不知道行数,想要一次性读取整个inputStream,我应该如何修改当前的readLine()函数。以下是该函数的代码:
```java String readLine() throws IOException { StringBuffer sb = new StringBuffer(); int i = 0; while ((i = inputStream.read()) != '\n') { if (i == -1) break; sb.append((char)i); } return sb.toString(); } ```
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();
}
3个回答

10

关于 Apache Commons IOUtils.readLines() 呢?

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

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

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

[更新] 关于 J2ME 上可用的评论,我承认我错过了这个条件,但是 IOUtils source 很少依赖,因此代码可能可以直接使用。


但它是否可用于J2ME平台? - Sujit Agarwal
@Coding-Freak:抱歉我错过了那个问题; 我对J2ME平台有些无知,因此我用我所知道的最好的来更新我的答案,祝你好运。 - Andrew White
我只想修改我目前正在使用的 readLine() 函数,使其能够一次读取整个流。希望你能理解我的问题。 - Sujit Agarwal

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;

我按照你说的修改了代码,现在它返回服务器没有响应。 - Sujit Agarwal
这不是完整的例子。如果已经收到-1并且在此之后没有读取,则应添加一些EOF标志。 - MByD
请帮我完成剩下的代码。我完全卡住了。 :( - Sujit Agarwal
我现在无法编写真正的、经过测试的代码(因为我在这台电脑上没有Java环境),但你为什么不使用我在答案开头建议的while循环,而不是你的扩展readLine呢? - MByD

1
具体针对 Web 服务器!
String temp;
StringBuffer sb = new StringBuffer();
while (!(temp = input.readLine()).equals("")){
    sb.append(line);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接