关于Java:一次读取输入流

Reading an inputStream all at once

本问题已经有最佳答案,请猛点这里访问。

我开发了一个J2ME应用程序,它通过套接字连接到我的网络托管服务器。我使用自己的扩展linereader类从服务器读取响应,该类扩展了基本的inputstreamreader。如果服务器发送5行回复,则逐行读取服务器回复的语法为:

1
2
3
4
5
6
7
8
9
        line=input.readLine();
        line = line +"
"
+ input.readLine();
        line = line +"
"
+ input.readLine();
        line = line +"
"
+ input.readLine();
        line = line +"
"
+ input.readLine();

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public String readLine() throws IOException {
    StringBuffer sb = new StringBuffer();
    int c;
    while ((c = read()) > 0 && c != '
'
&& c != '
'
&& c != -1) {
        sb.append((char)c);
    }
    //By now, buf is empty.
    if (c == '
'
) {
        //Dos, or Mac line ending?
        c = super.read();
        if (c != '
'
&& c != -1) {
            //Push it back into the 'buffer'
            buf = (char) c;
            readAhead = true;
        }
    }
    return sb.toString();
}

Apache Commons ioutils.readlines()怎么样?

Get the contents of an InputStream as a list of Strings, one entry per line, using the default character encoding of the platform.

或者,如果只需要一个字符串,请使用ioutiles.toString()。

Get the contents of an InputStream as a String using the default character encoding of the platform.

[更新]根据J2ME上关于这个的评论,我承认我错过了这个条件,但是ioutils源对依赖性很轻,所以代码可能可以直接使用。


专门针对Web服务器!

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


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

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

在循环中添加计数器,如果计数器=0,则返回空值:

1
2
3
4
5
6
7
8
9
int counter = 0;
while ((c = read()) > 0 && c != '
'
&& c != '
'
&& c != -1) {
    sb.append((char)c);
    counter++;
}
if (counter == 0)
    return null;