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

长度为0的byte[]数组与InputStream.readAllBytes()工作原理疑问

为什么初始化长度为0的byte数组能接收InputStream读取的字节?

核心原因很简单:你代码里的bytes是个引用变量,一开始它指向的是长度为0的数组,但后续被重新赋值成了readAllBytes()返回的全新数组——原来的空数组根本没被用来存储读取的字节,自然不会触发数组越界。

具体拆解你的代码逻辑:

  • 第一行byte[] bytes = new byte[0];:只是让bytes这个变量“指向”一个长度为0的byte数组对象,但这个对象后续完全没被操作。
  • 关键的bytes = resourceAsStream.readAllBytes();:readAllBytes()方法会自己创建一个足够容纳文件内容的新byte数组,把输入流里的所有字节填进去,然后把这个新数组的引用赋值给bytes。这时候bytes已经不再指向原来的空数组了,原来的空数组会被Java自动回收。

你提到的bytes[0] = 100;会报错,是因为直接对长度为0的数组做索引写入,但你的代码里根本没碰那个空数组——全程都是用新数组来存数据,所以不会有问题。

可以加一段验证代码直观看到变化:

byte[] bytes = new byte[0];
System.out.println("初始数组长度:" + bytes.length); // 输出0
try {
    InputStream resourceAsStream = ArrayBasics.class.getResourceAsStream("/test.json");
    bytes = resourceAsStream.readAllBytes();
    System.out.println("赋值后数组长度:" + bytes.length); // 输出文件实际字节长度
    System.out.println(Arrays.toString(bytes));
} catch (Exception e) {
    System.out.println("Some exception");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:40:41