缓冲流

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流之字节缓冲路的更多相关文章

  1. 01 语言基础+高级:1-8 File类与IO流_day10【缓冲流、转换流、序列化流】

    day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能 ...

  2. File类与常用IO流第八章——缓冲流

    第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类:   输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...

  3. Java IO流之字符缓冲流

    字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileRe ...

  4. Java IO流之【缓冲流和文件流复制文件对比】

    与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...

  5. JAVA序列化和反序列化 对象<=>IO流 对象<=>字节数组

    http://developer.51cto.com/art/201202/317181.htm http://blog.csdn.net/earbao/article/details/4691440 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲

    内容改成abc 来个数组缓冲

  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_2_BufferedOutputStream_字节缓冲

    子类 继承父类,这些方法都可以使用 必须写上flush,刷新数据数据才能写入到文件内

  8. java中IO流之字节字符流的总结概述

    概念        这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  9. java IO流之三 使用缓冲流来读写文件

    原文:http://blog.csdn.net/haluoluo211/article/details/52183219 一.通过BufferedReader和BufferedWriter来读写文件 ...

随机推荐

  1. css3 2d转换3d转换以及动画的知识点汇总

    css3 2d转换 2d转换的方法: 1.移动 translate(x, y) 可以改变元素的位置,x.y可为负值: 2.缩放 scale(x, y) 可以对元素进行水平和垂直方向的缩放,x.y的取值 ...

  2. 【福利大放送】不止是Android,Github超高影响力开源大放送,学习开发必备教科书

    一.写在前面 最近项目重构,时间贼多,也没什么时间更新博客,个人的开源项目也是多时没有更新了:github地址,然而没有更新不代表我不在乎,后面一有空还是会继续提交的. 还是来冒个泡,给大家献上一些福 ...

  3. delete和delete[]

    c++中对new申请的内存的释放方式有delete和delete[两种方式,到底这两者有什么区别呢? 1.我们通常从教科书上看到这样的说明:delete 释放new分配的单个对象指针指向的内存dele ...

  4. NSDictionary 总结 -iOS

    总结:字典分NSDictionary(不可变,只能查询)和NSMutableDictionary(可变.能增删改查)两种,形式是key-value,key是不可重复的,value可以重复 1.初始化字 ...

  5. PLSQL程序流程

    IF语句结构: if(条件表达式)- -then- -执行语句;- -end; IF-THEN-ELSE语句结构: if(条件表达式)- -then- -执行语句;- -else- -执行语句;- e ...

  6. 关于BOM的理解

    BOM提供了很多对象,用于访问浏览器的功能,这些功能与网页内容无关 BOM的核心对象时window,她表示浏览器的一个实例 window的双重角色   1.JS访问浏览器窗口的一个接口  2.ECMA ...

  7. .Net程序员学用Oracle系列(18):PLSQL Developer 攻略

    1.功能说明及使用技巧 1.1.对象浏览器 1.2.SQL 窗口 1.3.测试窗口 1.4.命令窗口 1.5.图表窗口 1.6.报告窗口 1.7.右键菜单 1.8.快速登录技巧 1.9.其它 2.总结 ...

  8. Tinyshell: 一个简易的shell命令解释器

    这是自己最近学习Linux系统编程之后写的一个练手的小程序,能很好地复习系统编程中的进程管理.信号.管道.文件等内容. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. ...

  9. 极光推送-Java后台实现方式一:Http API

    Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请求API:https://api.jpush.cn/v3/push,另一种则是使用官方提供的第三方Java APIjar包,这里先 ...

  10. 我个人的Java学习经验(一家之言)

    声明:本文只是我的个人经验之谈,或者连经验之谈都算不上,因为我觉得自己还是个新手,没有什么经验可谈,就算是我分享一下自己从开始学习Java到现在的一些心路历程吧,各位看官暂且看吧,欢迎交流.第一部分算 ...