(18)IO流之字节缓冲路
缓冲流
BufferedInputStream 缓冲输入流
前面的练习告诉我们使用缓冲数组读取的效率更高,为了方便的大家的操作,sun
位大家提供了一个缓冲输入字节流对象,让我们可以更高效率的读取文件。
输入字节流的体系
InputStream 输入字节流的基类
|——FileInputStream 读取文件的字节流
|——BufferedInputStream 缓冲输入字节流,主要为了提高读取文件数据的效率.其实该类非常的简单,只是维护了一个8kB的字节数组而已
注意:凡是缓冲流都不具备读写文件的能力
BufferedInputStream 的使用步骤
1、找到目标文件
2、建立数据的输入通道(FielinputStream)
1、建立数据的缓冲输入字符流
2、输入数据
3、关闭通道资源
问题一:为什么创建BufferedInputStream独享的时候,非要传入一个FileInputStream对象?
是这样的,上面注意里面说,缓冲流不具备读取文件的能力,如果要去读写一个文件的话,必须要给它传递一个InputStream或者OutputStream对象。也就是说,BufferedInputStream对象本身也没有和文件建立一个通道,顺气自然的可以回答下一个问题
问题二:缓冲流关闭资源的问题。
只需要一步,fileInputStream.close() 关闭文件即可,因为bufferedInputStream本身并未建立通道但是BufferedInputStream也有一个close方法,查看源码就可以知道,这个方法里面调用的还是InputStream的clos方法,所以,fileInputStream.close()和BufferedInputStream.close()只需调用一个即可
问题三:下面的演示可以看到bufferedInputStream对象和fileInputStream对象读取数据基本上是一样一样的,都是read呢么,缓冲流的效率到底是怎么提高的呢?
这个查看一下BufferedInputStream的源码可以看得很清楚,搞清这个问题,更容易看到问题的本质。看一下BufferedInputStream的read的源码,你会发现他是这样操作的:在一个适当的机会,直接从硬盘上独处8kB的数据,存储到bufferInputStream维护的buf数组中,当你取数据的时候,BufferedInputStream是直接从自己维护的8kb的内存中帮你取数据,而不是像FileInputStream那样你去一个数据它就帮你从硬盘上读一个数据,相比之下,一个从硬盘取数据,一个从内存去数据,孰快孰慢立见分晓。这才是真正的缓冲技术。
BufferedInputStream真的就只是在内部维护了一个buf而已,当然在在创建bufferedInputStream实现的时候也稍微的多了一步,多以通函情况下,还是自己使用FileInputStream然后自己维护一个buf就可以了。
public static void readTeset2() throws IOException
{
//找到目标文件
File file = new File("D:\\b.txt");
//建立数据输入通道
FileInputStream fileInputStream = new FileInputStream(file);
//建立缓冲输入字节流
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
//读取文件数据
int content = 0;
while((content = bufferedInputStream.read())!=-1)
{
System.out.print((char)content);
}
//关闭资源
bufferedInputStream.close();
}
输出字节流
OutputStream 所有输出字节流的基类
|——FIleOutputStream 向文件输出数据的输出字节流
|——BufferedOutputStream 缓冲输出字节流,就是为了提高输出的效率,内部维护了一个8k b的字节数组
BufferedOutputStream的使用步骤
1、找到目标文件
2、建立数据的输出通道 FIleOutputStream
3、建立缓冲输出字节流对象
4、输出数据,别忘了配合使用flush
BufferedOutputStream 注意细节
1、使用BufferedOutputStream写数据的时候,它的write方法实现吧数据写到它维护的内部数组中。
2、使用BufferedOutputStream写数据的时候,它的write方法实现吧数据写到它维护的内部数组中,如果需要把内部字节数组中的数据写到硬盘上,这是需要调用flush方法或者close方法,flush方法的作用,就是把数组中的数据写到硬盘上或者当内部维护的字节数组装满的时候也会自动调用flush把数组中的数据刷出到硬盘。
public static void main(String[] args) throws IOException
{
//找到目标文件
File file = new File("D:\\a.txt");
//建立输出字节流
FileOutputStream fileOutputStream = new FileOutputStream(file);
//建立缓冲输出字节流
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); //把数据写出
bufferedOutputStream.write("hello world!".getBytes());
bufferedOutputStream.flush();
//关闭资源
bufferedOutputStream.close();
}
//使用缓冲流拷贝图片
public static void copyImage()throws IOException
{
long start = System.currentTimeMillis();
//找到目标文件
File inFile = new File("D:\\1.jpg");
File outFile = new File("E:\\1.jpg");
//建立输出输出流
FileInputStream fileInputStream = new FileInputStream(inFile);
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
//建立缓冲输出输出流
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//边读边写
int content = 0;
// int length = bufferedInputStream.read(buf);//如果传入了缓存数组,内容是存储到缓冲数组中,返回的是存储到缓存中的字节个数
while((content = bufferedInputStream.read())!=-1)//如果使用read方法没有传入缓冲数组,那么返值是读到的内容,返回的是对应的int值
{
bufferedOutputStream.write(content);
bufferedOutputStream.flush();//这里不需要刷新,为什么?因为这里每读一个字节就刷新一次,这样反而降低了效率,倒不如,让他自己写满之后自己刷出去
}
bufferedOutputStream.close();
bufferedInputStream.close();
long end = System.currentTimeMillis(); System.out.println((end - start));
}
小结 字节流:
输入字节流
InputStream 输入字节流的基类 抽象类
|——FileInputStream 读取文件的输入字节流
|——BufferedInputStream 缓冲输入字节流,缓冲输入字节流的目的,为了提高读取文件的效率,该类其实就是在内部维护了一个8kB的缓冲字节数组。
输出字节流
OutputStrea输出字节流的基类 抽象类
|——FileOutputStream 向文件输出数据的输出字节流
|——BufferedOutputStream 缓冲输出字节流该类出现的目的,是为了提高写数据的效率,其实该类内部也是维护了一个8kB的数组而已,当调用起write方法的时候,数据默认是向其内部的数组中存储的,只要调用flush方法货值是close或者是8kB的数组存储满数据之后,才会想硬盘输出。
(18)IO流之字节缓冲路的更多相关文章
- 01 语言基础+高级:1-8 File类与IO流_day10【缓冲流、转换流、序列化流】
day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能 ...
- File类与常用IO流第八章——缓冲流
第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类: 输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...
- Java IO流之字符缓冲流
字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileRe ...
- Java IO流之【缓冲流和文件流复制文件对比】
与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...
- JAVA序列化和反序列化 对象<=>IO流 对象<=>字节数组
http://developer.51cto.com/art/201202/317181.htm http://blog.csdn.net/earbao/article/details/4691440 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲
内容改成abc 来个数组缓冲
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_2_BufferedOutputStream_字节缓冲
子类 继承父类,这些方法都可以使用 必须写上flush,刷新数据数据才能写入到文件内
- java中IO流之字节字符流的总结概述
概念 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...
- java IO流之三 使用缓冲流来读写文件
原文:http://blog.csdn.net/haluoluo211/article/details/52183219 一.通过BufferedReader和BufferedWriter来读写文件 ...
随机推荐
- Raft 实现日志复制同步
Raft 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频及 ...
- js_DOM操作
嗯,大过年的上次更新应该还是在,大年30前一天,说好的一天更一篇,感觉食言了,虽然没有更,但是,每天还是坚持在学习的,所以今天的任务就是把这几天学的都发上来. 博客,我觉得不仅仅是交流知识的地方,我宁 ...
- gulp源码解析(二)—— vinyl-fs
在上一篇文章我们对 Stream 的特性及其接口进行了介绍,gulp 之所以在性能上好于 grunt,主要是因为有了 Stream 助力来做数据的传输和处理. 那么我们不难猜想出,在 gulp 的任务 ...
- (原创)Java多线程作业题报java.lang.IllegalMonitorStateException解决
作业: 有一个水池,水池容量500L,一边为进水口,一边为出水口,要求进水放水不能同时进行,水池一旦满了不能继续注水,一旦空了,不能继续放水,进水速度5L/s,放水速度2L/s. 这是我学多线程时做的 ...
- 一篇文章搞定css3 3d效果
css3 3d学习心得 卡片反转 魔方 banner图 首先我们要学习好css3 3d一定要有一定的立体感 通过这个图片应该清楚的了解到了x轴 y轴 z轴是什么概念了. 首先先给大家看一个小例子: 卡 ...
- 分布式缓存技术memcached学习系列(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前, ...
- Kafka概念入门(一)
序:如何保证kafka全局消息有序? 比如,有100条有序数据,生产者发送到kafka集群,kafka的分片有4个,可能的情况就是一个分片保存0-25,一个保存25-50......这样消息在kafk ...
- JDBC连接数据库(二)——连接池
参考博客:http://www.cnblogs.com/xdp-gacl/p/4002804.html 一. 应用程序直接建立数据库连接模型 应用程序直接每次访问数据库时,都建立创建一个数据库的链接, ...
- jQuery UI 实例 - 自动完成(Autocomplete)
http://www.runoob.com/jqueryui/example-autocomplete.html 自定义数据并显示 您可以使用自定义数据格式,并通过简单地重载默认的聚焦和选择行为来显示 ...
- ubuntu12.04下安装pptp_vpn服务器
1.下载安装apt-get install pptpd 2.配置/etc/pptpd.confvim /etc/pptpd.conf添加下面两行(在配置文件的最后取消注释修改IP即可)localip ...