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

为何Java中Readable接口的read()方法未显式调用却能正常执行?

底层原理说明

  • 首先,CharGeneratorAdapter实现的Readable是Java标准库定义的统一字符源接口,该接口仅约定了一个核心方法read(CharBuffer cb),作用是让字符源的实现类自定义数据生成逻辑,供上层读取工具调用。
  • 你在初始化Scanner时传入了CharGeneratorAdapter实例,Scanner的构造器原生支持接收Readable类型作为输入源,内部会持有该实例的引用。
  • 你调用的x.hasNext()、x.nextLine()等Scanner方法本身不存储输入数据,当内部缓冲区没有可解析的内容时,Scanner会自动调用持有的Readable实例的read()方法,拉取新的字符数据填充到缓冲区后再完成解析逻辑。你没有显式调用read()方法,但Scanner的内部逻辑帮你完成了调用,这是Java标准库基于接口解耦的典型设计,属于策略模式的应用:你只需要自定义数据生成逻辑,不需要关心Scanner的解析流程,只要符合Readable接口约定的实现类都可以作为Scanner的输入源。
  • 你代码中的read()方法返回-1时,Scanner会判定输入源已经耗尽,此时hasNext()会返回false,循环终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:54:04