A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package cn.com.mybufferedreader;

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

/**
* 自定义缓冲区,模拟BufferedReader
* @author Administrator
*
*分析:缓冲区就是封装了一个数组,并对外提供方法对数组进行访问,
*             方法最终操作的是数组的指针(角标)
*
*缓冲区的原理:
*        1.从源文件中获取一批数据装进缓冲区(数据)
*        2.再从缓冲区(数组)中取出一个一个的数据
*注意:在此次取完之后,继续从源文件中取数据到缓冲区,数据为空时,用-1作为结束标记
*/
public class MyBufferedReader {
        private FileReader f;
        //创建全局数组,作为缓冲区
        private char[] buf=new char[1024];
        //定义一个指针用来操作这个数组中的元素,操作到最后一个元素时,pos归零
        private int pos=0;
        //定义一个计数器用来记录缓冲区(数组)中的数据个数,当数据个数为零,就从源文件中继续获取数据到缓冲区中(数组)
        private int count=0;
        MyBufferedReader(FileReader f){
                this.f=f;
        }
        /**
         * myRead()方法从缓冲区中一次取一个字符
         * @return
         * @throws IOException
         */
        public int myRead() throws IOException{
                if(count==0){
                        count=f.read(buf);
                        pos=0;
                }
                char ch=buf[pos++];
                pos++;
                count--;
                if(count<0)
                        return -1;
                /*
                //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;
                }
                 */
                return ch;
        }
        public String myReadLine() throws IOException{
                //创建一个缓冲区(数组),StringBuilder是一个可变的字符序列
                StringBuilder sb=new StringBuilder();
                int ch=0;
                while((ch=myRead())!=-1){
                        //读到'\r',继续读下一个数据
                        if(ch=='\r')
                                continue;
                        //读到'\n',返回读到数据得字符串
                        if(ch=='\n')
                                return sb.toString();
                        //将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中(sb数组)
                        sb.append((char)ch);
                }
                return null;
        }
        public void myClose() throws IOException {

                f.close();
        }
}


1 个回复

倒序浏览
package cn.com.mybufferedreader;

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

public class MyBufferedReaderDemo {
        public static void main(String[] args) throws IOException{
                //创建读取流,并与源文件相关联
                FileReader fr=new FileReader("copy_01.txt");
                //创建一个自定义读取流缓冲区对象,并与被缓冲流相关联
                MyBufferedReader bufr=new MyBufferedReader(fr);
                 String line=null;
                 while((line=bufr.myReadLine())!=null){
                         System.out.println(line);
                 }
                //关闭流
                 bufr.myClose();
        }
}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马