为何两个看似相等的字符串匹配失败?Java字符串对比问题求助
解决Java中Socket返回字符串对比始终为false的问题
嘿,我碰到过好几次这种Socket字符串对比踩坑的情况,咱们一步步来排查问题哈!
最常见的原因:隐藏的空白/换行字符
你用readLine()读取内容时,这个方法会读取到换行符(\n)或回车符(\r)之前的内容,但不会包含这些换行/回车符。但很多服务器返回数据时,可能会在目标字符串后面附带额外的\r、\n或者空格——这些字符肉眼看不到,但会导致equals对比直接失败。
比如服务器实际返回的是"S\r"或者"S ",你打印的时候看起来是S,但实际字符串长度是2,自然和"S"不相等。
解决/调试方法:
- 先打印读取到的字符串的原始内容和长度,确认有没有隐藏字符:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8")); String code = in.readLine(); if (code != null) { // 用单引号包裹,能清晰看到前后的空白 System.out.println("读取到的内容:'" + code + "',长度:" + code.length()); } else { System.out.println("读取到null,可能Socket流已关闭"); } - 如果确认有空白字符,可以用
trim()去除前后空白后再对比(注意:如果你的业务字符串本身需要保留首尾空格,就不能用这个方法):if (Objects.equals(code != null ? code.trim() : null, "S")) { // 你的业务逻辑 }
第二个可能:字符编码不匹配
虽然你指定了UTF8编码,但如果服务器返回数据时用的是其他编码(比如GBK、ISO-8859-1),读取出来的字符串就会乱码,对比自然失败。
解决方法:
- 先打印读取到的
code值,如果是乱码,尝试更换编码测试,比如改成GBK:BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK")); - 最好和服务器端确认好统一的字符编码。
第三个可能:readLine()读取不完整或阻塞
readLine()的工作逻辑是必须读取到换行符/回车符,或者流结束才会返回。如果服务器只发送了"S"但没有发送换行/回车符,readLine()会一直阻塞,直到Socket流关闭,这时候可能返回null,或者你后续的逻辑根本没执行到对比步骤。
解决方法:
如果服务器不会发送换行符,建议改用字节流读取固定长度的内容:
InputStream is = socket.getInputStream(); // 假设服务器只返回1个字符的内容 byte[] buffer = new byte[1]; int len = is.read(buffer); if (len > 0) { String code = new String(buffer, 0, len, "UTF8").trim(); if (Objects.equals(code, "S")) { // 你的业务逻辑 } }
最后:排查null情况
如果in.readLine()返回null,说明Socket输入流已经关闭,这时候Objects.equals(null, "S")肯定是false,所以一定要先判断code是否为null再处理。
内容的提问来源于stack exchange,提问作者Noel Nemeth
相关产品推荐
相关产品推荐

