[英]How to read CR LF line with BufferedReader?
我正在嘗試創建一個簡單的Java服務器應用程序,但我正在努力正確地讀取用戶的BufferedReader輸入。 問題是行分隔符只是CR LF(“\\ r \\ n”) - 所以我不能使用readLine()標准方法。 因此,我嘗試實現自己的方法:
private String readCRLFLine(BufferedReader in) {
StringBuilder result = new StringBuilder();
char cr = 'a'; // initialize cr
char lf;
try {
while (((lf = (char) in.read()) != '\n') && (cr != '\r')) {
cr = lf;
result.append(lf);
}
result.deleteCharAt(result.length() - 1); // delete \r from the result
} catch (IOException ex) {
// handle the exception here
}
return result.toString();
}
現在,當我嘗試獲取並打印結果時:
while ((userMessage = readCRLFLine(inputStream)) != null) {
System.out.println(userMessage);
break;
}
...它只將字符序列打印到第一個換行符(“\\ r”或“\\ n”),其余的輸入由方法readCRLFLine(inputStream)的第二次調用讀取 - 它應該已經讀取其他輸入。
我希望能夠處理如下輸入:
“ABC \\ RABC \\ n \\ r \\ ABC \\ r \\ n”
在這種情況下,userMessage應該是:
“ABC \\ RABC \\ n \\ r \\ ABC”
我不能使用Scanner,它是“useDelimeter(”\\ r \\ n“)”方法,因為我需要使用“clientSocket.setSoTimeout(TIMEOUT)”設置TIMEOUT,據我所知,掃描儀無法實現這一點。
我的“readCRLFLine”方法出了什么問題? 這個問題還有其他解決辦法嗎?
任何幫助,將不勝感激。
您的方法不正確,因為while
條件不是您實際需要的條件。
它說“只要當前讀取的字符不同於\\n
且前一個字符與\\r
\\n
不同,繼續閱讀”。
但這意味着當你讀取\\n
,該條件為false ,因為lf != '\\n'
為false。 所以它會停在第一個\\n
。 它也將停止在\\r
cr != '\\r'
任何字符,因為然后cr != '\\r'
將為false
使組合條件為false。
當前字符為\\n
且前一個字符為\\r
時,您希望停止循環。 這意味着你的條件應該是! ( lf == '\\n' && cr == '\\r')
! ( lf == '\\n' && cr == '\\r')
。
現在要注意德摩根法:“不(A和B)”相當於“不是A 或不是B”。 你錯誤地決定使用AND而不是OR。 將您的條件更改為:
while (((lf = (char) in.read()) != '\n') || (cr != '\r')) {
...
}
順便說一下, in
將其轉換為char
並進行比較之前,您應該檢查從中讀取的值是否為負值。 負值表示客戶端關閉了連接,如果發生這種情況,您將進入無限循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.