我来给你说 :终于查到了
你去看看java api源码 里面的实现,大体说一下:
FileInputStram里面实现了InputStream的read();这个read()定义为native的 ,具体与操作系统硬盘的复制api有关,实现一次硬盘io读一个字节。(这个java管不了),另外重写了read(byte[] b, int off, int len)方法,而这个重写的方法里面调用的是FileInputStream独有的 private native int readBytes(byte b[], int off, int len) 方法,这个方法也是本地的方法。与硬盘io的直接操作有关,应该用c写的,这个和那个read()有根本的区别,就是一次io读b个字节!BufferedInputStream里面继承了FilterInputStream里面的InputStream成员in,就在你构造这个BufferedInputStream对象的时候FileInputStram传进去了,BufferedInputStream的read()调用的自己的fill(),而fill()调用的FilterInputStream的read(byte b[], int off, int len),继而调用传进去的FileInputStram的read(byte b[], int off, int len),也就调用了native int readBytes(byte b[], int off, int len) 方法。 从而实现了缓存。
你也可以看看BufferedInputStream里面的read(byte b[], int off, int len),方法,都是调用的一样的native方法,具体二者为什么会有时差,和缓存大小有关!就是和readByte里传的b的大小有关!仅此而已。什么方法怎么写都会回归到最原始和windows操作系统打交道的微软上,这个c++,我放弃的真不对。 |