You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Socket使用ObjectInputStream传输文件仅得到NUL空字符问题

核心问题1:服务端数组使用错误

你服务端代码存在非常明显的低级错误:
你调用len = in.read(bytes,0, chunkSize)时,是将Socket读取到的字节写入了bytes数组,但后续写入本地文件时调用的是fileOut.write(arr, 0, len),你写入的是初始化后未做任何赋值的arr数组,这个数组所有元素默认都是0值,对应ASCII中的NUL字符,这就是你文件大小匹配但内容全是NUL的直接原因。
修复方法:将写入文件的代码改为fileOut.write(bytes, 0, len)即可解决内容全空的问题。

核心问题2:流方法混用风险

你怀疑的ObjectInputStream混用readObject()和read(byte[])确实存在风险:
ObjectInputStream/ObjectOutputStream是Java专属的序列化流,本身内置了序列化协议头和对象元数据结构。混用原始字节读写和对象读写会导致流指针偏移混乱,writeObject()写入的序列化元数据会被read(byte[])当成文件内容读取,反过来原始字节也会被readObject()当成序列化数据解析,极易出现数据错乱、解析失败的问题。
修复建议:要么统一使用普通字节流(如BufferedInputStream/BufferedOutputStream)传输,控制指令自行约定特殊字节标识;要么所有传输内容都封装为对象统一用writeObject()/readObject()读写,不要混用两种读写模式。

核心问题3:收发同步逻辑不匹配

你两端的同步逻辑完全不对应:

  • 服务端逻辑:每收到一块字节数据,就回发ack,之后立刻等待客户端返回的控制指令
  • 客户端逻辑:一次性将所有文件字节全部发完,才会开始等待服务端的ack
    这会导致服务端在发完第一个ack之后就阻塞在readObject(),而客户端还在不断发文件字节,后续所有字节都会被服务端当成对象序列化数据解析,就算修复了数组错误也会出现传输异常。
    修复建议:调整客户端逻辑,每发送一个块就等待服务端的ack,收到ack后再发送下一个块,和服务端逻辑对齐。

内容的提问来源于stack exchange,提问作者Arturo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:24:09