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

实现InputStream子类时,能否修改请求读取但未实际读取的字节?

关于java.io.InputStream#read(byte[], int, int)缓冲区修改限制的问题

官方JDK文档对java.io.InputStream#read(byte[], int, int)的说明包含以下两条约束:

设k为实际读取的字节数;这些字节将存储在b[off]到b[off+k-1]的元素中,b[off+k]到b[off+len-1]的元素保持不变。

无论何种情况,b[0]到b[off-1]以及b[off+len]到b[b.length-1]的元素均保持不变。

第一条约束确实更为严格,针对你的问题:你不能修改b[off+k]~b[off+len-1]这部分元素,哪怕是临时修改也不行。

文档里的“保持不变”是InputStream实现必须遵守的契约——调用方完全可能在调用read方法前,已经在这些区域存储了需要保留的数据。如果你的实现临时修改了这些位置,哪怕后续尝试恢复,也存在风险:比如方法执行中意外抛出异常,导致修改的内容无法复原;或者在并发场景下,其他线程可能看到被临时修改的无效数据,破坏程序的正确性。

如果你的实现需要临时缓冲区处理数据,正确的做法是自行创建独立的临时数组,不要复用传入缓冲区中约定不可修改的部分。这样既能严格遵守父类方法的契约,也能安全完成数据处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:05:59