基于自定义BufferedReader中的read和readLine方法

实例如下所示:

package day0208;

import java.io.FileReader;
import java.io.IOException;

/*
 * 自定义读取缓冲区,实现BufferedReader功能
 * 分析:
 * 缓冲区就是封装了一个数组,并对外提供了更多的方法对数组进行访问
 * 其实这些方法最终操作的都是数组的角标
 * 缓冲的原理:
 * 其实就是从源中获取一批数据装进缓冲区,再从缓冲区取出数据
 * 当此次取完后,继续从源中取出一批数据到缓冲区
 * 当源中的数据取光时,用-1作为结束标记。
 */
public class MyBufferReader {
    private FileReader r;
    MyBufferReader(FileReader r){
       this.r=r;
    }
    //定义一个数组作为缓冲区
    private char[] buf=new char[1024];
    //定义个指针用于操作这个数组的元素,当操作到最后一个元素后,指针应该归零
    private int pos=0;
    //定义一个计数器,用于记录缓冲区中的数据个数,当该数据减到0,就从源中继续获取数据到缓冲区中。
    private int count =0;
    public int myRead() throws IOException{//自定义read方法
       if(count==0){//如果缓冲区中没有数据,则从源中获取一批数据到缓冲区
           count=r.read(buf);
           pos=0;
       }
       if(count<0){
           return -1;
       }
       char ch=buf[pos++];//一次从缓冲区获取一个字符
       count--;
       return ch;
    }
    public String myReadLine() throws IOException{//自定义readLine犯法
       StringBuilder sb=new StringBuilder();
       int ch=0;
       while((ch=myRead())!=-1){//只要还有数据就进行读取
           if(ch=='\n')//java换行符,停止读取,将已经读取到的数据输出返回
              return sb.toString();
           if(ch=='\r')
              continue;//window下的换行符,不读也不换行,继续读取后面的字符
           sb.append((char)ch);//正常情况下,不断进行读取
       }
       if(sb.length()!=0)//如果文档中中有字符,就返回读取到的数据
           return sb.toString();
       return null;//如果是空文档,就返回空
    }
    public void myClose() throws IOException{
       r.close();//关闭流资源
    }
}

这样就Ok了,可以进行检测

package day0208;

import java.io.FileReader;
import java.io.IOException;

public class MyDemo {
  public static void main(String[] args) throws IOException {
    FileReader fw=new FileReader("C:\\demo2.txt");
    MyBufferReader br=new MyBufferReader(fw);
    String line1=null;
    while((line1=br.myReadLine())!=null){
      System.out.println(line1);
    }
//   int num=0;
//   while((num=br.myRead())!=-1){
//     System.out.print((char)num);
//   }
    br.myClose();
  }
}

两种检测方法都可以。

以上这篇基于自定义BufferedReader中的read和readLine方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中BufferedReader与BufferedWriter类的使用示例

    BufferedReader BufferedReader 是缓冲字符输入流.它继承于Reader. BufferedReader 的作用是为其他字符输入流添加一些缓冲功能. 创建BufferReader时,我们会通过它的构造函数指定某个Reader为参数.BufferReader会将该Reader中的数据分批读取,每次读取一部分到缓冲中:操作完缓冲中的这部分数据之后,再从Reader中读取下一部分的数据. 为什么需要缓冲呢?原因很简单,效率问题!缓冲中的数据实际上是保存在内存中,而原始数据可能

  • 自定义BufferedReader的实例

    缓冲区的建立目的就是增加传输性能,使我们传输数据更加快速 缓冲区的内部其实很简单 就是在内部封装了一个数组 用数组来存储数据 对外提供一些方法对数组进行访问 其中这些方法的操作就是对数组的指针(角标). 缓冲区的原理:从源中获取一批数据到缓冲区,再从缓冲区中一个一个取出 取完后用-1作为结束标记 在BufferedReader中我们读取数据方法有read() ,readLine() read() 其参数为char[],cbuf,int off,int len.其返回值为-1 readLine()

  • 基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现BufferedReader功能 * 分析: * 缓冲区就是封装了一个数组,并对外提供了更多的方法对数组进行访问 * 其实这些方法最终操作的都是数组的角标 * 缓冲的原理: * 其实就是从源中获取一批数据装进缓冲区,再从缓冲区取出数据 * 当此次取完后,继续从源中取出一批数据到缓冲区 * 当源中的数据取光时

  • IOS中自定义类中限制使用原生实例化方法

    IOS中自定义类中限制使用原生实例化方法 在自定义的类中,除了有系统自带的实例化方法外,还可能会有开发者自定义的实例化方法.当不想使用系统自定义方法时,而仅使用自定义的实例化方法时,可以这样做下限制. 如下示例所示: #import <UIKit/UIKit.h> @interface MYView : UIView // 限制使用系统方法进行实例化 // 方法1 - (instancetype)init UNAVAILABLE_ATTRIBUTE; // 方法2 - (instancetyp

  • JavaScript基于自定义函数判断变量类型的实现方法

    本文实例讲述了JavaScript基于自定义函数判断变量类型的实现方法.分享给大家供大家参考,具体如下: 通常用typeof来判断js变量的类型,但很多时候仅仅typeof满足不了要求的. 我写了一个自定义函数来做这个事,判断的比较全面了. function varType(v){ if ( typeof v=== "object" ){ if (v=== null ) return 'null' ; if (v. constructor ) return (v. constructo

  • 基于vue 开发中出现警告问题去除方法

    出现这个警告问题的时候 我们可以去main.js中在头部添加这句话: Vue.config.productionTip = false 这样即可去除警告! 以上这篇基于vue 开发中出现警告问题去除方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: 使用vue.js开发时一些注意事项 Vue开发过程中遇到的疑惑知识点总结

  • PHP 基于Yii框架中使用smarty模板的方法详解

    第一种方法按照YII系统的办法生成视图觉得有点麻烦,觉得用smarty更省事.尝试着把smarty模板加进来了. 复制代码 代码如下: date_default_timezone_set("PRC");class PlaceController extends CController {protected $_smarty;function __construct(){parent::__construct('place');//需要一个参数来调用父类的构造函数,该参数为控制器ID$p

  • DevExpress实现自定义GridControl中按钮文字内容的方法

    在一些C#项目的开发中,有时候会使用到GridControl的FindPanel,这样可以很好的对数据进行筛选,可是所展现的按钮文字是英文,如下图所示: 那怎么定义两个按钮问题,以符合项目需求了?本文讲述利用GridLocalizer来实现这一要求的方法.具体步骤如下: 主要功能代码如下: public class BuilderGridLocalizer : GridLocalizer { Dictionary<GridStringId, string> CusLocalizedKeyVal

  • 详解Angularjs 自定义指令中的数据绑定

    有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊 到底怎么用 这个话题. 一. 自定义指令 自定义指令,是 Angularjs 用来实现组件化的方式,相比于 React 和 Vue 的组件化方式,它真的很复杂,自定义指令太重了,它暴露了太多可供定制的参数,以至于普通的开发者完全不知道要用它来做什么而将其束之高阁,毕竟一般的业务逻辑通过controller和service就已经可以完成了. 自定义指令在 Angularjs

  • Vue自定义指令中无法获取this的问题及解决

    目录 自定义指令中无法获取this 解决方法 Vue使用this的这几个坑你都知道吗 一.普通函数 二.Vue中的this 自定义指令中无法获取this 问题 最近在使用自定义指令时遇到一个问题,我想在指令里通过this直接去访问vue实例数据,但是显示未定义,经大佬提醒,里面的this很可能不是指向vue实例 解决方法 在函数里增加第三个参数vnode,vnode.context就是指向当前的vue实例 总结 指令里的this不是指向vue实例,可以使用vnode.context获取this

  • Spring MVC中基于自定义Editor的表单数据处理技巧分享

    面向对象的编程方式极大地方便了程序员在管理数据上所花费的精力.在基于Spring MVC的Web开发过程当中,可以通过对象映射的方式来管理表单提交上来的数据,而不用去一个一个地从request中提取出来.另外,这一功能还支持基本数据类型的映射.例如in.long.float等等.这样我们就能从传统单一的String类型中解脱出来.然而,应用是灵活的.我们对数据的需求是千变万化的.有些时候我们需要对表单的数据进行兼容处理. 例如日期格式的兼容: 中国的日期标注习惯采用yyyy-MM-dd格式,欧美

随机推荐