2011-04-22 94 views
7

我開發了一個j2me應用程序,它通過套接字連接到我的虛擬主機服務器。我使用擴展了基本InputStreamReader的擴展lineReader類從服務器讀取響應。如果服務器發送5行答覆,通過線讀取服務器答覆線的語法是:一次讀取inputStream

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

在這種情況下,因爲我知道有答覆的固定編號i可以寫此語法。但是如果我不知道行數,並且想要一次讀取整個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(); 
} 

回答

5

那麼Apache Commons IOUtils.readLines()呢?

使用平臺的默認字符編碼獲取InputStream的內容作爲字符串列表,每行一個條目。

或者如果你只是想單個字符串使用IOUtiles.toString()

使用平臺的默認字符編碼獲取InputStream的內容爲String。

[更新]每註釋這個是avaible J2ME的,我承認我錯過了條件然而,IOUtils source是依賴非常輕,所以也許代碼可以直接使用。

+0

但它可用於j2me平臺嗎? – 2011-04-22 01:43:09

+0

@ Coding-Freak:對不起,我錯過了;我對J2ME平臺有點無知,所以我用我所知道的最好的祝福更新了我的答案,祝你好運。 – 2011-04-22 01:46:30

+0

我只是想修改我目前正在使用的readLine()函數,以便能夠一次讀取整個流。希望你理解這個問題。 – 2011-04-22 01:52:09

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; 
+0

我按照你的說法修改了代碼。現在它返回從服務器沒有響應。 – 2011-04-22 02:12:09

+0

這不是一個完整的例子。你應該添加一些EOF標誌,如果-1已經收到,之後沒有讀取。 – MByD 2011-04-22 02:17:36

+0

請幫我解決其他問題。我完全沉迷於此。 :( – 2011-04-22 02:24:23

0

具體爲Web服務器!

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