2014-11-02 56 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