簡體   English   中英

如何用BufferedReader讀取CR LF線?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM