长度为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
相关产品推荐
相关产品推荐

