java中BufferedInputStream相较于FileInputStream的优势是那些?

北国先生 2014-12-24 03:34:49
BufferedInputStream 是把流暂时读取到一个缓冲数据组里面,而后直接操作数组里面的数据,这样比直接操作文件快了很多,但我有一个疑问.为什么不直接用FileInputStream 里面的read(buffer)方法,直接读取到自己的buffer 里面,然后写的时候直接把自己的buffer 写的文件里面,而不用BufferedInputStream 读取到内部定义的缓冲区,然后自己还得从它的缓冲里面进行数组拷贝,这样不是慢了很多了么,为什么不直接把自己buffer 写进去,感觉还是这样快,还是不理解BufferedInputStream 的作用?求指教.....
...全文
321 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
szzdsrdx 2017-03-09
  • 打赏
  • 举报
回复
为什么上面的链接 这个 http://www.software8.co/wzjs/java/1770.html 打不开啊,
woting521 2014-12-25
  • 打赏
  • 举报
回复
楼下10个苹果,要送到10层,一个一个送,还是10个一起送好
北国先生 2014-12-25
  • 打赏
  • 举报
回复
引用 2 楼 t_jl1979 的回复:
BufferedInputStream里面的read读取操作: if (len >= getBufIfOpen().length && markpos < 0) { return getInIfOpen().read(b, off, len); } 从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。 不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解?
北国先生 2014-12-25
  • 打赏
  • 举报
回复
引用 7 楼 t_jl1979 的回复:
[quote=引用 6 楼 rhjetjdfgjr 的回复:] [quote=引用 5 楼 t_jl1979 的回复:] [quote=引用 4 楼 rhjetjdfgjr 的回复:] [quote=引用 2 楼 t_jl1979 的回复:] BufferedInputStream里面的read读取操作: if (len >= getBufIfOpen().length && markpos < 0) { return getInIfOpen().read(b, off, len); } 从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。 不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解? [/quote]我只例举了一个,其他方法都是类似。[/quote] 我也看了一下BufferedInputStream的源码,它默认为使用者创建了一个缓冲区,可以自定义大小,也可以使用默认大小,同时重写了FileInputStream的read方法,然后定义了一个私有的read1方法,在这个私有方法中调用了fill()方法。这个fill方法我没看明白,它的作用是什么?如你所说是对数据进行预读,那么它是怎么实现的?还望不吝赐教,感激不尽啊 [/quote] 看一下这个篇文章。 http://www.software8.co/wzjs/java/1770.html [/quote] 真是太谢谢你了 上面的链接中的内容讲的很详细。
冥王之锤 2014-12-25
  • 打赏
  • 举报
回复
引用 6 楼 rhjetjdfgjr 的回复:
[quote=引用 5 楼 t_jl1979 的回复:] [quote=引用 4 楼 rhjetjdfgjr 的回复:] [quote=引用 2 楼 t_jl1979 的回复:] BufferedInputStream里面的read读取操作: if (len >= getBufIfOpen().length && markpos < 0) { return getInIfOpen().read(b, off, len); } 从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。 不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解? [/quote]我只例举了一个,其他方法都是类似。[/quote] 我也看了一下BufferedInputStream的源码,它默认为使用者创建了一个缓冲区,可以自定义大小,也可以使用默认大小,同时重写了FileInputStream的read方法,然后定义了一个私有的read1方法,在这个私有方法中调用了fill()方法。这个fill方法我没看明白,它的作用是什么?如你所说是对数据进行预读,那么它是怎么实现的?还望不吝赐教,感激不尽啊 [/quote] 看一下这个篇文章。 http://www.software8.co/wzjs/java/1770.html
北国先生 2014-12-25
  • 打赏
  • 举报
回复
引用 5 楼 t_jl1979 的回复:
[quote=引用 4 楼 rhjetjdfgjr 的回复:] [quote=引用 2 楼 t_jl1979 的回复:] BufferedInputStream里面的read读取操作: if (len >= getBufIfOpen().length && markpos < 0) { return getInIfOpen().read(b, off, len); } 从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。 不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解? [/quote]我只例举了一个,其他方法都是类似。[/quote] 我也看了一下BufferedInputStream的源码,它默认为使用者创建了一个缓冲区,可以自定义大小,也可以使用默认大小,同时重写了FileInputStream的read方法,然后定义了一个私有的read1方法,在这个私有方法中调用了fill()方法。这个fill方法我没看明白,它的作用是什么?如你所说是对数据进行预读,那么它是怎么实现的?还望不吝赐教,感激不尽啊
冥王之锤 2014-12-25
  • 打赏
  • 举报
回复
引用 4 楼 rhjetjdfgjr 的回复:
[quote=引用 2 楼 t_jl1979 的回复:] BufferedInputStream里面的read读取操作: if (len >= getBufIfOpen().length && markpos < 0) { return getInIfOpen().read(b, off, len); } 从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。 不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解? [/quote]我只例举了一个,其他方法都是类似。
冥王之锤 2014-12-24
  • 打赏
  • 举报
回复
BufferedInputStream里面的read读取操作: if (len >= getBufIfOpen().length && markpos < 0) { return getInIfOpen().read(b, off, len); } 从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。 不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
永不感冒患者 2014-12-24
  • 打赏
  • 举报
回复
刚查的 BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),它自己不能脱离里面那个单独存在。FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。 FileInputStream与BufferedInputStream区别: FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;
目 录 第一章 JAVA入门 10 计算机语言发展史 10 机器语言 10 汇编语言 10 高级语言 10 其他高级语言 11 JAVA发展简史 12 JAVA为什么能够流行? 13 JAVA各版本的含义 13 JAVA技术体系架构 14 JAVA的特性和优势 14 JAVA应用程序的运行机制 15 JVM(JAVA VIRTUAL MACHINE) 16 Java运行时环境JRE(Java Runtime Environment) 17 JAVA语言应用范围 18 第一个JAVA程序 18 JAVA开发环境搭建 18 一个典型的JAVA程序的编写和运行过程 19 第一个程序常见错误 20 第一个JAVA程序的总结和提升 20 常用Java开发工具 20 常用dos命令 21 本章笔试作业 21 本章上机操作 21 第二章(1) 编程的基本概念 22 注释 22 标识符 22 关键字/保留字 23 变量(variable) 24 常量(Constant) 25 命名规则(规范) 25 基本数据类型(primitive data type) 26 整型变量 26 浮点型 27 字符型(2个字节): 28 boolean类型 29 运算符(operator) 29 二元运算符 29 一元运算符 30 布尔逻辑表达符 30 位运算符 30 扩展运算符 31 字符串连接符 31 三目条件运算符 31 运算符优先级的问题 31 自动类型转换 32 基本类型转化时常见错误和问题 33 方法 33 简单的键盘输入和输出 33 本章思考作业 34 上机操作 34 第二章(2) 控制语句 35 顺序结构 35 选择结构 35 if单选择结构 35 if-else双选择结构 35 If-elseif-else多选择结构 36 switch多选择结构 37 循环结构 39 While和dowhile的区别 41 For循环 42 break语句和continue语句 47 语句块 48 递归结构 49 本章作业 50 本章上机操作 51 第三章 JAVA面向对象程序开发 52 编程语言发展史 52 类和对象是如何产生发展的?如何进化的? 52 面向对象思想初步(OOP初步Object Oriented Programming) 53 面向对象编程的语言的三大特征简介 56 对象和类的概念 56 类和对象初步 57 测试类的定义方式 57 简单的学生类编写示例 58 内存分析 59 属性(field,或者叫成员变量) 59 引用类型 60 类的方法 60 对象的创建和使用 60 构造器(或者叫做构造方法,constructor) 60 垃圾回收机制(Garbage Collection) 63 方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? 70 继承使用要点 71 Object类 72 toString方法 72 equals方法 73 super关键字 74 方法的重写(override) 74 隐藏/封装(encapsulation) 75 为什么需要封装?封装的作用和含义? 75 使用访问控制符,实现封装 76 封装的使用细节 76 多态(polymorphism) 76 为什么需要多态? 76 如何实现多态? 77 方法绑定(method binding) 77 静态绑定 77 动态绑定 77 多态的使用要点 78 对象的转型(casting) 79 final 81 抽象类 82 抽象类的使用要点 83 接口 83 为什么需要接口? 84 如何定义接口? 84 接口的本质探讨 84 接口使用要点 85 接口的多继承 86 面向接口编程 87 OOP更多应用 87 组合 87 内部类(innerclasses) 88 字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分类 96 Error 97 Error和Exception的区别 97 Exception 97 异常的处理办法之一,捕获异常 99 try块 99 catch 99 finally 100 try, catch,finally ,return 执行顺序 100 异常的处理办法之二,声明异常:

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧