黑马程序员技术交流社区

标题: 关于缓冲流的疑问 [打印本页]

作者: 我能学编程吗    时间: 2013-10-22 23:16
标题: 关于缓冲流的疑问
本帖最后由 我能学编程吗 于 2013-10-22 23:18 编辑

拿输出流提问
疑问:缓冲流是不是对于调用write(int b) 方法的才起到缓冲的作用,对于调用write(byte b[])write(byte b[], int off, int len)方法的话,使不使用缓冲流效果是一样的???
查看FileOutputStream,有如下写的方法:
查看源码可知write(int b)调用的源码如下:public native void write(int b) throws IOException;
调用write(byte b[])或write(byte b[], int off, int len)的最终是调用了下面的方法:private native void writeBytes(byte b[], int off, int len) throws IOException;

write(int b)方法功能是写一个字节,如果有1万个字节要写,那就得写1万次。
writeBytes(byte b[], int off, int len)一次性写入的。

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
而所以谓的缓存流,是不是作用只在于调用write(int b) 方法时起到了缓冲作用,因为它不是立请立刻写进去,而是等到缓存数量够了再调用write(byte[] b,int off, int le)方法。
如果我不是调用write(int b)方法的话,是不是没有必要用缓冲流啊?直接使用FileOutputStream的write(byte b[], int off, int len)方法就行了。


作者: 1961993790    时间: 2013-10-23 11:11
这个很好理解啊,在对文件的操作中都必须要用缓冲流,
作者: 1961993790    时间: 2013-10-23 11:23
1961993790 发表于 2013-10-23 11:11
这个很好理解啊,在对文件的操作中都必须要用缓冲流,

只是缓冲的字节大小不一样,字节流一次只能缓冲一个字节,而字符流
就像一个容易,可以缓冲很多字节大小,其实底层都是调用的缓冲器write(int b)
使用的时候这就取决于你操作文件的大小,看使用哪个缓冲器,给你打个比方吧,方便你的
理解,加入你去和水,如果你不是很渴的话,只要取一个小的杯子(这个杯子就是:wirte(byte 【】b)就能够解决口渴,如果你很渴的话,那你就需要大的杯子(这个杯子就是:wirte(int b)或•write(byte b[], int off, int len))具有生活常识的都会选择这种办法,而不是用一个小的杯子一次一次的取水,而选择一个大的杯子只要一次就能解决口渴问题,希望对你有用,这是我的理解。需要纠正的是,对文件的操作都需要缓冲流,只是缓冲的大小不一样。希望对您有用!
一次就能够解决口渴的问题,
作者: 我能学编程吗    时间: 2013-10-23 15:40
1961993790 发表于 2013-10-23 11:23
只是缓冲的字节大小不一样,字节流一次只能缓冲一个字节,而字符流
就像一个容易,可以缓冲很多字节大小 ...

谢谢!
但是您的说法我不太赞同。我不知道您是写错了还是理解错了,您说一个小杯子就是write(byte[] b),还有大杯子是write(int b)这个我就不认同了。write(byte[] b)是一次写出多个字节怎么会是小杯子,而write(int b)是一次只写一个字节怎么会是大杯子。
还有您说write(int b)是底层的缓冲器,它是怎么个缓冲法?它就是写一个字节,没有缓冲。
作者: 1961993790    时间: 2013-10-23 17:25
不好意思,我写错了小杯子就是write(int b),还有大杯子是write(byte 【】 b),实在不好意思哈
作者: 1961993790    时间: 2013-10-23 17:29
write(int b)是底层的缓冲器,它是写一个字节,然后就写入到内存中,就好比你缓冲一个我就写入到内存一个,而write(byte 【】b)就是你缓冲一堆,我就等缓冲完后写入到内存(个人理解)。
作者: 我能学编程吗    时间: 2013-10-23 19:18
本帖最后由 我能学编程吗 于 2013-10-23 19:20 编辑
1961993790 发表于 2013-10-23 17:29
write(int b)是底层的缓冲器,它是写一个字节,然后就写入到内存中,就好比你缓冲一个我就写入到内存一个, ...

谢谢你的回答,不过我还是不太认同的。你说write(int b)是缓冲器我觉得不是,它不就是写一个字节出去而已,没有什么缓冲。我上面所说的缓冲流,如BufferedOutputStream是一个缓冲流,当我们调用BufferedOutputStream的write(int b)方法的时候,它不会立刻调用底层流的write(int b)立刻把这个字节写出去,而是把int b中的这个字节保存到一个数组中,当这个数组的容量到达缓冲的最大容量时,BufferedOutputStream就会调用底层的write(byte[] b)方法来一次写出去。
我是想说,如果我不使用write(int b)方法的话,使用缓冲流与原始的流就没有区别了,如下:
FileOutputStream.write(byte b[])
BufferedOutputStream.write(byte b[])


上面两个类的两个方法,是不是没有区别呢?只有当调用下面两个类的两个方法时才有区别呢?如下:
FileOutputStream.write(byte b)          // 立刻把b写出去
BufferedOutputStream.write(byte b)  // 先把b存到一个byte[] buf缓存中,buf容量满了再调用write(byte b[])方法一次写出去






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2