(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来读写文件 ...
随机推荐
- 史上最牛逼的文件bom头清除代码,万能检测清除php,js等等
做php开发,经常部分uft8的php文件因BOM头不同导致各种错误和错位.网上搜到的大部分所谓的去处bom工具都是2货,没有能用的.下面的一段代码,请复制到一个php文件里,然后上传到你的网站根目录 ...
- Java中Redis简单入门
Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...
- ODBC
ODBC是80年代末90年代初出现的技术,它为编写关系数据库的客户软件提供了统一的接口.ODBC只提供单一的API,可用于处理不同数据库的客户应用程序.使用ODBC API的应用程序可以与任何具有OD ...
- 使用vlmcsd自建KMS服务~一句命令激活windows/office
服务作用:在线激活windows和office 适用对象:VOL版本的windows和office 适用版本:截止到win10和office2016的所有版本 服务时间:24H,偶尔更新维护 优点:在 ...
- webpack1.x 升级到 webpack2.x 英文文档翻译
近日项目要升级到webpack2.2,原来使用的webpack版本是1.12,在升级项目的同时,翻译一下官方的升级文档,去掉了一些不常用的配置 resolve.root, resolve.fallba ...
- 读书笔记 effective c++ Item 13 用对象来管理资源
1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... ...
- angular 1.26 版本 window.history.back() 自动去顶部
在1.26版本,在url ("www.example.com#xx"),接着按back,会自动调到顶部,这是因为angular的默认设置 只要在config注入$AnchorScr ...
- 每天一个Linux命令(09)--touch命令
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]··· 文件··· 2.命令参数: -a 或 ...
- Struts2学习第一天——struts2基本流程与配置
struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实 ...
- Zookeeper + Kafka 集群搭建
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 kafka_2.12-0.10.2.0.tgz zookeeper-3.4.9.tar.gz ...