java IO教程《三》
缓冲区流讲解(Buffered)
什么是缓冲区?
缓冲流,也叫高效流,是对4个基本的File流的增强,所以也是4个流,按照数据类型分类:
- 字节缓冲流:BufferedInputStream,BufferedOutputStream
- 字符缓冲流:BufferedReader,BufferedWriter
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
缓冲技术的原理?
加载过程
整个过程可以形容成一个快递小哥,开始时候自行车送快递,一趟只能送一个,但是后来老板看他们太幸苦了,给他们配备了一辆五菱宏光,一次可以送好几十个,这就大大提高了效率。
缓冲区流采用装饰者模式去包装文件流跟字符流
字节流缓冲区
BufferedInputStream
Java BufferedInputStream类用于从流中读取信息。它内部使用缓冲机制来提高性能。BufferedInputStream的要点是:
当跳过或读取流中的字节时,内部缓冲区会自动从包含的输入流中重新填充,每次填充许多字节。
创建BufferedInputStream时,会创建一个内部缓冲区数组。
构造函数:
| 构造函数 | 说明 |
|---|---|
| BufferedInputStream(InputStream IS) | 它创建新的缓冲输出流,用于将数据写入指定的输出流。 |
| BufferedInputStream(InputStream IS, int size) | 创建新的缓冲输出流,用于将数据写入具有指定缓冲区大小的指定输出流。 |
方法:
| 方法 | 说明 |
|---|---|
| int available() | 它将指定的字节写入缓冲输出流。 |
| int read() | 它从给定的偏移量开始,将指定字节输入流中的字节写入指定的字节数组 |
| int read(byte[] b, int off, int ln) | 刷新缓冲区 |
| void close() | 刷新缓冲区 |
| void reset() | 刷新缓冲区 |
| long skip(long x) | 刷新缓冲区 |
BufferedOutputStream
Java BufferedOutputStream类用于缓冲输出流。它在内部使用缓冲区来存储数据。与直接将数据写入流相比,它提高了效率。因此,它使性能快速。要在OutputStream中添加缓冲区,请使用BufferedOutputStream类。让我们看看在OutputStream中添加缓冲区的语法:
构造函数:
| 构造函数 | 说明 |
|---|---|
| BufferedOutputStream(OutputStream os) | 它创建新的缓冲输出流,用于将数据写入指定的输出流。 |
| BufferedOutputStream(OutputStream os, int size) | 创建新的缓冲输出流,用于将数据写入具有指定缓冲区大小的指定输出流。 |
方法:
| 方法 | 说明 |
|---|---|
| void write(int b) | 它将指定的字节写入缓冲输出流。 |
| void write(byte[] b, int off, int len) | 它从给定的偏移量开始,将指定字节输入流中的字节写入指定的字节数组 |
| void flush() | 刷新缓冲区 |
字符流缓冲区
BufferedWriter
Java BufferedWriter类用于为Writer实例提供缓冲。写入速度很快。继承Writer类。缓冲字符用于提供对单个数组、字符和字符串的有效写入。
构造函数:
| 构造函数 | 说明 |
|---|---|
| BufferedWriter(Writer wrt) | 它用于创建使用输出缓冲区的默认大小的缓冲字符输出流。 |
| BufferedWriter(Writer wrt, int size) | 它用于创建使用指定大小的输出缓冲区的缓冲字符输出流。 |
方法:
| 方法 | 说明 |
|---|---|
| void newLine() | 通过编写行分隔符来添加新行。 |
| void write(int c) | 用于写入单个字符。 |
| void write(char[] cbuf, int off, int len) | 用于写入字符数组的一部分 |
| void write(String s, int off, int len) | 用于写入字符串的一部分。 |
| void flush() | 刷新输入流。| |
| void close() | 关闭缓冲区。 |
BufferedReader
Java BufferedReader类用于从基于字符的输入流中读取文本。可以通过readLine()方法逐行读取数据。读取速度很快。继承了Reader类。
构造函数:
| 构造函数 | 说明 |
|---|---|
| BufferedReader(Reader rd) | 它用于创建使用输入缓冲区的默认大小的缓冲字符输出流。 |
| BufferedReader(Reader rd, int size) | 它用于创建使用指定大小的缓冲区的缓冲字符输入流。 |
方法:
| 方法 | 说明 |
|---|---|
| int read() | 读取一个字节。 |
| int read(char[] cbuf, int off, int len) | 用于将字符读入数组的一部分。 |
| boolean markSupported() | 用于测试输入流对标记和重置方法的支持。 |
| String readLine() | 用于读取一行文本。 |
| boolean ready() | 用于测试输入流是否准备好读取。| |
| long skip(long n) | 跳过字节数 |
| boolean ready() | 用于测试输入流是否准备好读取。 |
| void reset() | 它将流重新定位到上次在此输入流上调用mark方法的位置。 |
| void mark(int readAheadLimit) | 用于标记流中的当前位置。 |
| void close() | 它关闭输入流并释放与该流关联的任何系统资源。 |
实战
读取文件内容然后写入另外一个文件
字节缓冲区流
public static void main(String[] args) {
//创建一个字节流,用于读取当前目录下的source文件夹中的压缩文件
InputStream in = new FileInputStream("/home/lumeng/practise_lum/uml_tmp_file.rar");
//创建一个文件字节输出流,用于将读取的数据写入test目录
OutputStream out = new FileOutputStream("/home/lumeng/practise_lum/test/uml_tmp_file.rar");
byte[] buff = new byte[1024]; //定义一个字节数组,作为缓冲区
int len; //定义一个int类型的变量len,记住每次读取的一个字节
long begintime = System.currentTimeMillis();//获取拷贝文件前的系统时间
while ((len = in.read(buff)) != -1) { //读取一个字节并判断是不是读到文件结尾
out.write(buff, 0, len);//从第一个字节开始,向文件写入len个字节
}
long endtime = System.currentTimeMillis();//获取文件拷贝结束时的系统时间
System.out.println("拷贝文件所消耗的时间是:" + ((endtime - begintime) / 1000) + "秒");
in.close();
out.close();
}
在拷贝的过程中,使用while循环语句,逐渐实现字节文件的拷贝,每循环一次,就从文件读取若干字节填充字节数组,并通过len记住读入数组的字节数,然后从数组的第一个字节开始,将len字节依次写入文件。循环往复,当len的值为-1时,说明已经读到了文件的末尾,循环结束,整个拷贝过程结束。我们可以看出这种操作比单纯字节留拷贝快很多。
字符缓冲区流
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\b.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\b.txt"));
String len =null;
while ((len = br.readLine())!=null){//注意此处readLine的默认值是null区别read()
bw.write(len);
//bw.write("\r\n"); 原先手动添加换行
bw.newLine(); // 调用换行方法
}
br.close();
bw.close();
}
识别下方二维码!回复:
入群,扫码加入我们交流群!
点赞是认可,在看是支持
java IO教程《三》的更多相关文章
- Java IO教程
1 Java IO 教程 2 Java IO 概述 3 Java IO: 文件 4 Java IO: 管道 5 Java IO: 网络 6 Java IO: 字节和字符数组 7 Java IO: S ...
- Java IO(四) InputStream 和 OutputStream
Java IO(四) InputStream 和 OutputStream 一.介绍 InputStream 和 OutputStream 是字节流的超类(父类),都是抽象类,都是通过实例化它们的子类 ...
- Java IO学习--(四)网络
Java中网络的内容或多或少的超出了Java IO的范畴.关于Java网络更多的是在我的Java网络教程中探讨.但是既然网络是一个常见的数据来源以及数据流目的地,并且因为你使用Java IO的API通 ...
- Java IO(四)——字符流
一.字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为一个Unicode字符占用2 ...
- Java IO教程 导读
Java IO是一套java 用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并有输入产生一些输出.Java为此提供了java.io包. 如果你浏览下java.io包,会对其中各样的类 ...
- Java IO(四)
在文件操作流中,输入输出的目标都是文件,但是有时候,我们并不需要写入文件,只是需要中转一下而已,这样就会显得很麻烦,所以我们就可以使用内存操作流.在内存操作流中,输入输出目标都是内存. 内存输出流:B ...
- java IO教程《四》
properties使用 什么是Properties? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置 ...
- 系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader
目录:系统学习 Java IO---- 目录,概览 BufferedReader BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲. 缓冲可以加快 I ...
- Java入门教程四(字符串处理)
Java 语言的文本数据被保存为字符或字符串类型.字符及字符串的操作主要用到 String 类和 StringBuffer 类,如连接.修改.替换.比较和查找等. 定义字符串 直接定义字符串 直接定义 ...
随机推荐
- (十九)VMware Harbor 详细介绍
一 . 简介 Harbor是VMware公司开源的企业级DockerRegistry项目,项目地址为https://github.com/vmware/harbor.其目标是帮助用户迅速搭建一个企业级 ...
- editorconfig、eslint、prettier三者的区别、介绍及使用
每次搭建新项目都少不了这些工具,但时间一久就忘记了,下次搭新项目时又要四处查官方文档,因此特此记录,主要内容是对这三个工具的理解,以及具体使用方式 editorconfig 理解 先看官网的定义: E ...
- Day05_25_Super关键字
Super关键字 Super关键字的所用 Super关键字的用法有三种: 在子类的成员方法中,访问父类的成员变量. 在子类的成员方法中,访问父类的成员方法. 在子类的构造方法中,访问父类的构造方法. ...
- Django 模板(Template)
1. 模板简介 2. 模板语言 DTL 3. 模板继承 4. HTML 转义 5. CSRF 1. 模板简介 作为 Web 开发框架,Django 提供了模板,可以很便利的动态生成 HTML.模版系统 ...
- mooc人大单元测试2
1 单选(2分) 下列选项中不是关系数据库基本特征的是( ). A. 不同的列应有不同的数据类型 B. 不同的列应有不同的列名 C. 与行的次序无关 D. 与列的次序无关 2 单选(2分) 关系代数 ...
- canvas性能优化总结
canvas的主要功能就是用来绘制内容,有时候为了给用户流畅的视觉感受,需要绘制的频率要求很高,这样对绘制的性能就有要求,那么怎么才能写出高性能的绘制代码呢. 尽可能少调用api 例如我们绘制一段线条 ...
- .Net之配置文件
1. 说明 默认情况下读取配置Configuration的默认优先级:ConfigureAppConfiguration(自定义读取)>CommandLine(命令行参数)>Environ ...
- Laravel5.6教程之——安装
1.安装 方式1:全局安装 通过composer安装 laravel 安装器 composer global require "laravel/installer" 1 确保将 c ...
- Android trap攻防思路整理
Android trap攻防 图/文 h_one 0x01 反 ...
- Linux日志分析和管理
目录 日志的作用.分类.管理.轮转和级别 rsyslog服务 Journal守护进程 /var/log下相关的日志文件 日志服务器的建立 日志的作用.分类.管理.轮转和级别 日志的作用: 用于记录系统 ...
