public class myBufferedReaderDemo {

public static void main(String[] arg) throws IOException{
FileReader fr = new FileReader("demo.txt");

MyBufferedReader bufr = new MyBufferedReader(fr);
String line = null;
while((line = bufr.myReadLine()) != null){
System.out.println(line);
}
}
}

//自定义缓冲区文件

/*
* 自定义的读取缓冲区。其实就是模拟一个BufferedReader
* 分析:
* 缓冲区无非就是封装一个数组
* 并对外提供更多的方法对数组进行访问。
*
* 缓冲的原理:
* 其实就是从源中获取一批数据装进缓冲区。
* 在缓冲区中不断的去处一个一个数据。
*
* 在此次取完后,在从源中继续取一批数据进缓冲区。
* 当源中的数据取光时,用-1作为结束标记。
*
*
*
*/

public class MyBufferedReader {
private FileReader r;
//定义一个字符数组作为缓冲区
private char[] buf = new char[1024];

//定义一个指针用于操作这个数组的元素,当操作到最后一个元素后,指针应该归零。
private int pos =0;

//定义一个计数器用于记录缓冲区的数据个数,当该数据减到0,就从源中继续获取数据到缓存区。
private int count =0;

MyBufferedReader(FileReader fileReader){
this.r = fileReader;
}

public int myRead() throws IOException{
//优化后的代码
if (count ==0) {
count = r.read(buf);
pos = 0;
}
if (count < 0) {
return -1;
}
char ch = buf[pos++];
count --;
return ch;

/*
//1.从源中获取一批数据到缓冲区。需要先做判断,只有计数器为0时,才需要从源中获取数据。
if (count == 0) {
count = r.read(buf);
if (count < 0) {
return -1;
}
//每次获取数据到缓冲区时,角标为0
pos = 0;
char ch = buf[pos];

pos ++;
count --;
return ch;
}else if (count > 0) {
char ch = buf[pos];

pos ++;
count --;
return ch;
}

*/
}
public String myReadLine()throws IOException {

StringBuilder sb =new StringBuilder();
int ch = 0;
while((ch= myRead()) != -1){
if (ch == '\r') {
continue;
}
if (ch == '\n') {
return sb.toString();
}
sb.append((char)ch);
}
if (sb.length() != 0) {
return sb.toString();
}
return null;

}
public void myClose() throws IOException{
this.r.close();
}

}

字符流-缓冲区-自定义myBufferedReader的更多相关文章

  1. 牛客网Java刷题知识点之字符流缓冲区、BufferedWriter、BufferedReader、BufferedReader-readLine方法原理、自定义MyBufferedReader-read方法、自定义MyBufferedReader-readLine方法

    不多说,直接上干货! 把提高效率的动作,封装成一个对象.即把缓冲区封装成一个对象. 就是在一个类里封装一个数组,能对流锁操作数据进行缓存. 什么是字符流缓冲区? 善于使用字符流缓冲区,减轻负担,提高下 ...

  2. Java:IO流之字符流缓冲区详解

    字符流缓冲区: 1.缓冲区的出现提高了对数据的读写效率: 2.对应类:BufferedWriter.BufferedReader: 3.缓冲区要结合流才可以使用: 4.在流的基础上对流的功能进行了增强 ...

  3. 字符流缓冲区的使用之BufferedWriter和BufferedReader

    从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取,代码中使用了输入缓冲区的特有的方法:readLine(),获取一行文本数据 import java.io.BufferedRea ...

  4. 字符流缓冲区BufferedReader之readLine方法的原理

  5. Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

    第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...

  6. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

    字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...

  7. 十八、Java基础--------IO流体系以及字符流

    在上一章节中详细介绍集合框架的相关知识,在接下来的几篇文章中将讲述Java中另一个及其重要的知识——IO流,本文主要是讲述IO流的一些基本概念以及字符流的相关应用. IO流 介绍IO流之前先介绍一下什 ...

  8. IO流回顾与总结第一篇之字节流与字符流的操作。。。。。

    一.引言 趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来...... 回归正题,IO流顾名 ...

  9. Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码

    请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...

随机推荐

  1. ORACLE取周、月、季、年的開始时间和结束时间

     1           取周的開始时间和结束时间 取周的開始时间.以星期一为開始. SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY ...

  2. 三元表达式之理解/jquery源代码分析之$.inArray实现

    每次看到三元表达式就会惶惶然分不清怎样读,正如语文中的断句一样,jquery源代码中的三元表达式更是不知怎样断句. 附jquery中的inArray实现. 大家熟悉jquery的应该都不陌生inArr ...

  3. mac 查看python路径

    1,terminal : input: which python 2,  terminal: input : python  --->import sys  ----> print sys ...

  4. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity

    上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...

  5. union关键字及大小端模式

    1. union 关键字 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在 union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有 ...

  6. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...

  7. C语言8大经典排序算法(1)

    算法一直是编程的基础,而排序算法是学习算法的开始,排序也是数据处理的重要内容.所谓排序是指将一个无序列整理成按非递减顺序排列的有序序列.排列的方法有很多,根据待排序序列的规模以及对数据的处理的要求,可 ...

  8. Docker Image发布

    Docker Image发布 方法1:导出镜像 #docker save -o centos-httpd-docker-image.tar centos:httpd 使用加载本地镜像 docker l ...

  9. [noip模拟赛]bird

    https://www.zybuluo.com/ysner/note/1295414 题面 \(R\)是一个猎人,他准备打猎,他站在平面直角坐标系的\((0,0)\)位置. 天上有\(n\)只小鸟从右 ...

  10. 2-4 原生小程序 - 自带组件及API

    获取用户的信息有两种,一种是不需要登录的,我们只需要获取用户的头像,还有微信的名.还有一种是登录的,就是登录后台校验的,就是获取用户的openid. webview,可以内嵌一个网页,类似于原生的开发 ...