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,我应该如何修改当前的
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; |