【发布时间】:2019-05-27 01:16:48
【问题描述】:
我刚刚看到InputStream (link to Java 11 API) 类有一个方法read(byte[] b) 可以按字节读取数据流。这不就是一种“缓冲阅读”吗?
我进一步看到,BufferedInputStream (link to Java 11 API) 没有自己的read(byte[] b) 实现。它使用其父类FilterInputStream 的方法。
那么,InputStream 类是否也支持缓冲读取?和BufferedInputStream类的区别在哪里?
编辑
将“read(byte b)”更正为“read(byte[] b)”。
【问题讨论】:
-
InputStream是一个抽象类,而不是一个接口!它确实提供了一个read(byte)方法.. 而这个是一个缓冲区,不是吗? -
不同之处在于,当您使用 InputStream 读取一个或一个字节缓冲区时,它只会读取该字节或这些字节(最大),仅此而已。使用 BufferedInputStream 时,读取单个字节或字节缓冲区实际上会加载更大的字节块并将它们保存在内存中,以便下次读取。
-
因此,如果您逐字节读取文件,或者使用 FileInputStream 从文件读取 10 个字节 x 10 个字节,您将进行大量文件系统读取,而如果您使用 BufferedInputStream,则第一次读取实际上会从文件系统中读取 8Kb 之类的内容,而下一次读取只会从内存缓冲区中读取,从而使其速度更快。简而言之,它的行为与您应该阅读的 javadoc 中描述的一样。
标签: java inputstream bufferedinputstream