我开发了一个通过套接字连接到我的虚拟主机服务器的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();
在这种情况下,我可以编写这种语法,因为我知道有一定数量的回复。但是如果我不知道行数,并且想要一次读取整个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();
}
答案 0 :(得分:8)
Apache Commons IOUtils.readLines()怎么样?
使用平台的默认字符编码,将InputStream的内容作为字符串列表获取,每行一个条目。
或者,如果您只想要一个字符串,请使用IOUtiles.toString()。
使用平台的默认字符编码将InputStream的内容作为String获取。
[更新]根据关于这个可用于J2ME的评论,我承认我错过了这个条件,但是IOUtils source对依赖关系非常清楚,所以也许代码可以直接使用。
答案 1 :(得分: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;
答案 2 :(得分:1)
专门用于Web服务器!
String temp;
StringBuffer sb = new StringBuffer();
while (!(temp = input.readLine()).equals("")){
sb.append(line);
}