2014-11-02 54 views
1

在嘗試將inputStream字符串與另一個字符串進行比較後,無論我做什麼(.equals,.compareTo),它們都不相等,即使它們是。inputStream字符串與字符串字面值不同

String readString = "READ"; 
System.out.println(method + " =? " + readString); 
if (method.trim().equalsIgnoreCase(readString)) { 
    System.out.println("Is READ"); 
} else { 
    System.out.println("Is not READ"); 
} 

它打印出來,

READ =? READ 
Is not READ 

即使方法變量肯定是閱讀。

然後我發送了一個我的朋友有同樣的問題,他說這是因爲inputStream我解析了方法變量。

BufferedReader inFromClient = new BufferedReader(
    new InputStreamReader(
     connectionSocket.getInputStream() 
    , "UTF8" 
    ) 
); 
StringBuilder arrInput = new StringBuilder(); 
char[] cbuf = new char[DEFAULT_BUFFER_SIZE]; 
int bytesRead; 

// Build client's input and parse it 
while (true) { 
    bytesRead = inFromClient.read(cbuf); 

    arrInput.append(cbuf); 
    ... 
    // lots of parsing below and then a break 
} 

我已經盡我的朋友的解決方案:String created from inputStream is not equal to its string literal

但我最終只獲得了輸入我讀的一部分,不像他做到了。

+0

請把代碼放在第一個塊上的方法 – rupps 2014-11-02 03:24:21

+2

你應該只從'cbuf'中追加'bytesRead'字節。 – 2014-11-02 03:45:46

回答

4

即使方法變量肯定是READ。

其實,這是絕對不是"READ"。如果是,那麼你會得到不同的輸出。電腦沒有錯。這裏真正的問題是,有一些你不明白的東西。

(有前車之鑑那裏...你將是明智的學習。)

有你所看到的兩種可能的解釋:

  • 有「隱形」(也就是「非打印」)字符在你想要比較的字符串之一中。通過調用trim()即可刪除前導空格和尾部空格,但還有其他不可見字符(trim()不會刪除)(例如ASCII NUL字符)。

  • 有看起來像其他的字符...但不是。 Google搜索詞「homoglyphs」。


事實上,看着你把字符轉換成一個StringBuffer(這大概然後給你,你正在測試......在String)的代碼,它是相當清楚的,問題是第一一。您正在從整個字符數組中創建一個字符串...而不是從讀取字符的數組部分創建一個字符串。這條線是不正確的:

arrInput.append(cbuf); 

「因爲你忽略了實際上讀的字符數。

+0

哎呀,確實如果我遇到這個問題,肯定不會閱讀它。無論如何,我將arrInput解析爲多個字符串,然後將它們與文字字符串進行比較。但是當你說我沒有使用讀取字符的數組部分時,你的意思是cbuf嗎?我實際上使用arrInput來解析。 – 2014-11-02 04:00:06

+0

啊,我把你提到的那一行改成了'arrInput.append(cbuf,0,bytesRead);'但是做完之後,我錯過了很多輸入數據。我正在嘗試閱讀的數據有換行符(\ r \ n)。 – 2014-11-02 04:05:26

+0

我不能告訴你爲什麼會發生這種情況,但它可能代表您未顯示的代碼。無論如何,'append(cbuf)'無可爭議地是錯誤的。閱讀javadocs。 – 2014-11-02 04:27:34