尝试将inputStream String与另一个String进行比较后,无论我做什么(.equals,.compareTo),它们都不相等,即使它们是。
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
即使方法变量肯定是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 :(得分:4)
即使方法变量肯定是READ。
实际上,绝对不是 "READ"
。如果是,那么你会得到不同的输出。电脑没错。这里真正的问题是你有一些不明白的事情。
(那里有一个教训......你明智地学习。)
您所看到的内容有两种可能的解释:
您要比较的其中一个字符串中有“隐形”(又名“非打印”)字符。通过调用trim()
,您将删除前导和尾随空格,但还有其他不可见的字符trim()
未删除(例如ASCII NUL字符)。
有些字符看起来像其他字符......但不是。谷歌搜索词“homoglyphs”。
确实,查看将字符放入StringBuffer
的代码(可能会给你正在测试的String
...),很明显问题是第一。您正在从整个字符数组创建一个字符串...而不是从您读取字符的数组部分。这一行不正确:
arrInput.append(cbuf);
'因为你忽略了实际读取的字符数。