IO 流之字符流的缓冲区
- 缓冲区的出现提高了对数据的读写效率
- 对应类:
- BufferedWriter
- BufferedReader
- 缓冲区需要结合流才可以使用, 对流的功能进行了增强, 即对流的操作起到装饰作用
使用缓冲区实现文本文件的写入和读取
// 写入
public class BufferedWriterDemo{
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("buf.txt");
// 为了提高写入的效率, 使用了字符流的缓冲区
// 创建了一个字符写入流的缓冲对象, 并和指定要被缓冲的流对象相关联
BufferedWriter bufw = new BufferedWriter(fw);
// 使用缓冲区的写入方法将数据写入到缓冲区中
bufw.write("abcde");
// 换行, 其实就是封装了系统属性 line.separator
// BufferedWriter 特有方法
bufw.newLine();
bufw.newline("hahaha");
// 使用缓冲区的刷新方法将数据刷入到目的地中
bufw.flush();
// 关闭缓冲区, 其实关闭的就是被缓冲的流对象
bufw.close();
}
}
// 读取
public class BufferedReaderDemo {
public static void main(String[] args){
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader();
/* 读取字符数组的方式
*
* char[] buf = new char[1024];
* int len = 0;
* while((len=bufr.read(buf))!= -1){
* System.out.println(new String(buf,0,len));
* }
*/
// 按一行读取, BufferredReader 特有方法: readLine()
// 如果到达流末尾, 返回 null
String line = null;
while((line=bufr.readLine()) != null){ // 注意: 此处判断的是 != null
System.out.println(line);
}
// 关闭缓冲区
bufr.close();
}
}
BufferedReader 中的 readLine() 方法原理
- BufferedReader 类复写了父类的以下方法:
- read(); : 读取单个字符
- read(char[] buf, int off, int len); : 读取数组的一部分
- BufferedReader 类自己特有的方法 readLine()
- BufferedReader 类继承了父类方法:
- read(char[] buf) : 将字符读入数组

readLine() 方法原理: 使用了读取缓冲区的 read() 方法, 将读取到的字符进行缓冲并判断换行标记. 将标记前的缓存数据变成字符返回.
模拟实现 BufferedReader
// 需求: 自定义的读取缓冲区, 其实就是模拟一个 BufferedReader
/* 分析:
* 缓冲区中无非就是封装了一个数组, 并对外提供了更多的方法对数组进行访问
* 其实这些方法最终操作的都是数组的角标
*
* 缓冲区原理: 其实就是从源中获取一批数据装进缓冲区中, 在从缓冲区中不断
* 的取出一个一个数据.
*
* 在缓冲区中数据此次取完后, 在从源中继续取一批数据进缓冲区, 当源中的数据取光时,
* 用 -1 作为结束标记
*/
public class MyBufferedReader{
private FileReader r;
// 定义一个数组作为缓冲区
private char[] buf = new char[1024];
// 定义一个指针用于操作这个数组中的元素, 当操作到最后一个元素时, 指针应该归 0
private int pos = 0;
// 定义一个计数器, 记录缓冲区中的数据个数. 当该数据减到0, 就从源中继续获取数据到缓冲区中
private int count = 0;
// 带参数的构造函数, 指定增强的流对象
public MyBufferedReader(FileReader r){
this.r = r;
}
// 定义从缓冲区读取单个字符的 read() 方法
public int myRead() throws IOException{
// 1. 从源中获取一批数据到缓冲区中, 需要先做判断, 只有计数器为 0 时, 才需要从源中获取数据
/* if(count == 0){
* // 记录从源中获取的数据个数
* count = r.read(buf);
* if(count < 0){
* return -1;
* }
* // 每次从源中获取数据到缓冲区后, 角标归零
* pos = 0;
* // 获取第一个数据
* char ch = buf[pos];
* pos++;
* count--;
* return ch;
* } else {
* char ch = buf[pos];
* pos++;
* count--;
* return ch;
* }
*/
// 代码优化:
if(count == 0){
count = r.read(buf);
pos = 0;
}
if(count < 0){
return -1;
}
char ch = buf[pos++];
count--;
return ch;
}
// 定义从缓冲区读取一行字符的 readLine() 方法
public String myReadLine() throws IOException{
// 定义一个数组容器, 存储从缓冲区中获取到的数据
StringBuilder sb = new StringBuilder();
// 使用自定义的 MyRead 方法, 从缓冲区中不断获取单个字符,
int ch = 0;
while((ch=myRead()) != -1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
// 将从缓冲区中读到的字符, 存储到缓存行数据的缓冲区中
sb.append((char)ch);
}
// 如果最后一行结尾没有回车符, 缓冲区的读取已结束,
// 但是并不能判断 if(ch=='\n'), 所有最后一行未能输出
if(sb.length() != 0)
return sb.toString();
return null;
}
public void myClose() throws IOException{
r.close();
}
}
使用缓冲区的方式复制文本文件
public class CopyTextByBufTest {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);
FileWriter fw = new FileWriter("buf_copy.txt");
BufferedWriter bufw = new BufferedWriter(fw);
/*
* int ch = 0;
* // 使用缓冲区对象进行单个字符的读写
* // 这是直接从内存中读取单个字符, 不是从硬盘中
* while((ch=bufr.read()) != -1){
* bufw.write(ch);
* }
*/
// 使用行进行读取文件
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush(); // 注意: 每次写入之后, 进行刷新保存
}
bufw.close();
bufr.close();
}
}
LineNumberReader 装饰类
- BufferedReader 的子类
- 可以跟踪行号的缓冲字符输入流
- setLineNumber(int); : 设置当前行号
- getLineNumber(); : 获取当前行号
参考资料
IO 流之字符流的缓冲区的更多相关文章
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
- JAVA IO 字节流与字符流
文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节. ...
- io系列之字符流
java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,ja ...
- JAVA之IO流(字符流)
字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...
- java io流(字符流) 文件打开、读取文件、关闭文件
java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...
- Java IO 字节流与字符流 (五)
Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...
- (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter
字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字 字符流 字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符 字符流: ...
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...
- Java:IO流之字符流缓冲区详解
字符流缓冲区: 1.缓冲区的出现提高了对数据的读写效率: 2.对应类:BufferedWriter.BufferedReader: 3.缓冲区要结合流才可以使用: 4.在流的基础上对流的功能进行了增强 ...
随机推荐
- 点滴积累【C#】---对上传文件的路径进行加密,以免将路径暴露在浏览器上,避免一些安全隐患!
效果: 描述: 本事例是为解决在上传或下载文件时避免将路径暴露在外.在上传时将路径进行加密保存到DataTable或数据库中,在下载是再读取DataTable中加密数据进行解密下载. 代码: [前台代 ...
- Atitit.http连接合并组件 ConnReducerV3 新特性
Atitit.http连接合并组件 ConnReducerV3 新特性 D:\0workspace\AtiPlatf_cms\src\com\attilax\util\ConnReducerV2. ...
- springboot文件上传下载,转载的
Spring Boot入门——文件上传与下载 原文来自:https://www.cnblogs.com/studyDetail/articles/7003253.html 1.在pom.xml文件中添 ...
- 基于Html5+HLS协议播放符合部标1078协议的实时流媒体视频
由于现在主流的部标GPS和1077视频监控平台,都是BS架构,在网页上播放视频,早期的很多平台用的都是ActiveX控件的形式,依赖于IE浏览器,需要降低浏览器的安全设置,而且非常难用.同时由于win ...
- iOS swift 关于自定义表情键盘
目录 输入框 键盘监听 键盘切换 表情装载 表情加载 表情输入 表情输出 表情显示 结束语 demo下载 demo图片: 输入框 为了让输入框能够随着用户输入内容变化自动变化高度,这里的输入框使用UI ...
- 如何设置UITextView不可被编辑
在项目中遇到一些需求需要把文字用UITextView来展示,但是该文字不能被编辑,只要把以下该代理方法实现就可以了 -(BOOL)textViewShouldBeginEditing:(UITextV ...
- NGUI3.7.4实现循环拖动
前段时间下了NGUI新版本3.7.4,看到例子Endless Scroll Views,实现了循环拖动,可能会用到,先把实现步骤贴出来跟大家分享一下. 1.首先新建一个背景. 2.添加所需控件,类似滑 ...
- jQuery 实战读书笔记之第三章:操作 jQuery 集合
创建新 HTML 元素 $('<div>Hello</div>'); /* 创建等价的空 div 元素 */ $('<div>'); $('<div /> ...
- JQ 时间插件
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/ueditor/u ...
- oracle+SQL优化实例
1. 减少I/O操作: SELECT COUNT(CASE WHEN empno>20 THEN 1 END) c1,COUNT(CASE WHEN empno<20 THEN 1 ...