InputStream与FileInputStream的read(byte[],int,int)方法是否相同?
FileInputStream与InputStream的read(byte[], int, int)方法差异及替代问题
首先明确:这两个方法完全不同,也不建议用父类的方法替代FileInputStream的native实现,原因如下:
1. 实现逻辑的本质区别
- InputStream作为抽象父类,它的
read(byte b[], int off, int len)是通用兜底实现,逻辑是循环调用无参的read()方法(每次读取1个字节),把读到的字节逐个填充到数组指定位置,直到读满len个字节或到达文件末尾。这种写法是给所有未重写该方法的子类留的通用方案,效率极低。 - FileInputStream重写了这个方法,直接调用native的
readBytes方法,通过操作系统底层文件IO接口一次性读取多字节数据到数组中,大幅减少JNI调用次数,是专门针对文件读取场景优化的高性能实现。
2. 能否替代?
技术上强制调用父类方法(比如super.read(b, off, len))代码能运行,但会带来严重性能问题:
- 比如读取1KB数据,父类实现需要调用1024次native的
read()方法,而FileInputStream的native实现仅需1次系统调用,数据量越大,性能差距越夸张。 - 另外,父类默认实现没有利用文件系统缓存机制,进一步加剧性能损耗。
总结
两者方法签名一致,但实现逻辑和性能天差地别。FileInputStream的native版本是专门为文件IO优化的,绝对不建议用InputStream的默认实现替代它。
内容的提问来源于stack exchange,提问作者cuo yiban
相关产品推荐
相关产品推荐

