如何通过Java Socket接收字节流 解决空字节\x00接收为空问题
Java Socket接收
\x00字节串问题解决方案 Java完全可以正常接收包含\x00的字节串,你遇到的问题是现有代码逻辑错误导致的。
现有代码问题根因
- 你使用
try-with-resources声明DataInputStream,每次循环执行完成后会自动关闭流,连带Socket连接也会被关闭,首次读取完成后后续再也无法接收数据。 read()方法的返回值是本次读取到的字节长度,并非读取到的内容本身,如果你后续将字节数组转字符串时使用了错误的转换逻辑(比如错误地遇到\x00就截断),也会得到空字符串的结果。
正确实现代码
import java.nio.charset.StandardCharsets; public void start() { // 流初始化放到循环外,避免重复创建和关闭 try (DataInputStream reader = new DataInputStream(client.getInputStream())) { byte[] buffer = new byte[2048]; int readLen; // read返回-1代表上游已关闭流 while (!client.isClosed() && (readLen = reader.read(buffer)) != -1) { // 截取实际读取到的有效字节段 byte[] realData = new byte[readLen]; System.arraycopy(buffer, 0, realData, 0, readLen); // 打印验证字节内容,\x00会输出为0x00 System.out.println("读取到字节长度:" + readLen); for (byte b : realData) { System.out.printf("0x%02X ", b); } System.out.println(); // Java字符串原生支持存储`\u0000`(对应字节\x00),不会自动截断 String content = new String(realData, StandardCharsets.UTF_8); System.out.println("转换后字符串长度:" + content.length()); } } catch (IOException e) { e.printStackTrace(); } }
补充说明
- Java的字符串不存在C语言的
\x00截断规则,只要正确读取到字节,\x00会被识别为合法字符\u0000存储。 - 如果后续需要将包含
\x00的字符串和其他系统交互,只需要确认对端的处理逻辑支持即可。
内容的提问来源于stack exchange,提问作者CHIL HASK
相关产品推荐
相关产品推荐

