(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来读写文件 ...
随机推荐
- ubuntu下安装ssh服务器方法
由于xshell远程连接ubuntu是通过ssh协议的,所以,需要给ubuntu安装ssh服务器. 1)ubuntu安装ssh服务器 sudo apt-get install openssh-serv ...
- Python系列之heapq内置模块
heapq 是 python 的内置模块,源码位于 Lib/heapq.py ,该模块提供了基于堆的优先排序算法. 堆的逻辑结构就是完全二叉树,并且二叉树中父节点的值小于等于该节点的所有子节点的值.这 ...
- PLSQL游标使用
游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据.由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标.游标可以看做是指向记录 ...
- Wpf中鼠标样式的修改,作用点修改
最近,在做一个控件的鼠标样式,Ps加了插件,可以编辑生成.cur格式的图标. 可是,所有的改完以后,调试运行,结果发现自己制作的图标的作用点总是在左上角,而不是在"手形"图标的食指 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- nginx配合IIS实现简单负载均衡
1.IIS 部署两个站点端口分别为8081和8082 8081站点和8082站点如下[随便写了个没有样式的很丑的页面],我特意加了111和222区分 2.设置nginx配置文件,实现简单的负载 ...
- JDK1.8源码阅读系列之四:HashMap (原创)
本篇随笔主要描述的是我阅读 HashMap 源码期间的对于 HashMap 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 接下来会从以下几个方面介绍 HashMap 源码相关知识: 1 ...
- SpringMVC中404错误解决方法总结
在新手配置Spring MVC的时候,感觉都弄好了之后,运行起来却显示404错误. 网上对出现404的问题不同情况,都有了解决方法,前几天我也遇到了这个问题,顺便把这些问题总结一下. 解决问题最重要的 ...
- JAVA程序测试之Swing编程
package swingtest; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt. ...
- jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...