import java.io.FileReader; import java.io.IOException; public class MyBufferedReader { private FileReader fr;// 先要有个包装对象 private char[] buf = new char[1024];// new一个缓存 private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的) private int pos = 0;// 当前读取字符的位置 public MyBufferedReader(FileReader fr) {//构造传参 this.fr = fr; } /*从缓存中读取一个字符返回给调用方。 * 如果缓存中不存在字符数据,就用被包装对象fr * 到磁盘中去读取一堆数据放到缓存中。 */ public int read() throws IOException{ if(count==0){//缓存是空的,必须到磁盘中加载 count =fr.read(buf); pos=0; } if(count<0){ //已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做) return -1; } char c=buf[pos]; count--; pos++; return c; } public String readLine() throws IOException{ StringBuilder sb=new StringBuilder(); int c=0; while((c=read())!=-1){ char ch=(char) c; if(ch=='\n'){ return sb.toString(); } sb.append(ch); } if(sb.length()!=0){//最后一行没有换行符,也要返回 return sb.toString(); } return null; } }
import java.io.FileReader; import java.io.IOException; public class MyBufferedReader { private FileReader fr;// 先要有个包装对象 private char[] buf = new char[1024];// new一个缓存 private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的) private int pos = 0;// 当前读取字符的位置 public MyBufferedReader(FileReader fr) {//构造传参 this.fr = fr; } /*从缓存中读取一个字符返回给调用方。 * 如果缓存中不存在字符数据,就用被包装对象fr * 到磁盘中去读取一堆数据放到缓存中。 */ public int read() throws IOException{ if(count==0){//缓存是空的,必须到磁盘中加载 count =fr.read(buf); pos=0; } if(count<0){ //已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做) return -1; } char c=buf[pos]; count--; pos++; return c; } public String readLine() throws IOException{ StringBuilder sb=new StringBuilder(); int c=0; while((c=read())!=-1){ char ch=(char) c; if(ch=='\n'){ return sb.toString(); } sb.append(ch); } if(sb.length()!=0){//最后一行没有换行符,也要返回 return sb.toString(); } return null; } } import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import org.junit.Test; public class TestMyBufferedReader { @Test//API中的BufferedReader---read() public void testread() throws IOException{ FileReader fr=new FileReader("a.txt"); BufferedReader bfr=new BufferedReader(fr); /* char c = (char) bfr.read(); System.out.println(c); */ int c; while((c=bfr.read())!=-1){ char ch=(char) c; System.out.print(ch); } System.out.println(); } @Test//我们开发的MyBufferedReader---read() public void testMyRead() throws IOException{ FileReader fr=new FileReader("a.txt"); MyBufferedReader mbr=new MyBufferedReader(fr); /* char c = (char) bfr.read(); System.out.println(c); */ int c; while((c=mbr.read())!=-1){ char ch=(char) c; System.out.print(ch); } System.out.println(); } @Test//API中的BufferedReader---readLine() public void testReadLine() throws IOException{ FileReader fr=new FileReader("a.txt"); MyBufferedReader br=new MyBufferedReader(fr); String str=null; while((str=br.readLine())!=null){ System.out.print(str); } System.out.println(); } @Test//MyBufferedReader---readLine() public void testMyReadLine() throws IOException{ FileReader fr=new FileReader("a.txt"); MyBufferedReader br=new MyBufferedReader(fr); String str=null; while((str=br.readLine())!=null){ System.out.print(str); } System.out.println(); } }
import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; //v2版本: 只是包装InputStreamReader类 public class MyBufferedReader { private InputStreamReader fr;// 先要有个包装对象 private char[] buf = new char[1024];// new一个缓存 private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的) private int pos = 0;// 当前读取字符的位置 public MyBufferedReader(InputStreamReader fr) {//构造传参 this.fr = fr; } /*从缓存中读取一个字符返回给调用方。 * 如果缓存中不存在字符数据,就用被包装对象fr * 到磁盘中去读取一堆数据放到缓存中。 */ public int read() throws IOException{ if(count==0){//缓存是空的,必须到磁盘中加载 count=fr.read(buf); pos=0; } if(count<0){ //已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做) return -1; } char c=buf[pos]; count--; pos++; return c; } public String readLine() throws IOException{ StringBuilder sb=new StringBuilder(); int c=0; while((c=read())!=-1){ char ch=(char) c; if(ch=='\n'){ return sb.toString(); } sb.append(ch); } if(sb.length()!=0){//最后一行没有换行符,也要返回 return sb.toString(); } return null; } } import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import org.junit.Test; public class TestMyBufferedReader { @Test//API中的BufferedReader---read() public void testread() throws IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt")); BufferedReader br = new BufferedReader(isr); /* char c = (char) isr.read(); System.out.println(c); */ int c; while((c=isr.read())!=-1){ char ch=(char) c; System.out.print(ch); } System.out.println(); } @Test//我们开发的MyBufferedReader---read() public void testMyRead() throws IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt")); MyBufferedReader br = new MyBufferedReader(isr); /* char c = (char) bfr.read(); System.out.println(c); */ int c; while((c=isr.read())!=-1){ char ch=(char) c; System.out.print(ch); } System.out.println(); } @Test//API中的BufferedReader---readLine() public void testReadLine() throws IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt")); BufferedReader br = new BufferedReader(isr); String str=null; while((str=br.readLine())!=null){ System.out.print(str); } System.out.println(); } @Test//MyBufferedReader---readLine() public void testMyReadLine() throws IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt")); MyBufferedReader br = new MyBufferedReader(isr); String str=null; while((str=br.readLine())!=null){ System.out.print(str); } System.out.println(); } }
import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; //v3版本: 最终版,能够兼容所有Reader public class MyBufferedReader extends Reader{ //★ private Reader r;//要拥有一个被包装对象 private char[] buf = new char[1024];// new一个缓存 private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的) private int pos = 0;// 当前读取字符的位置 public MyBufferedReader(Reader r) {//构造传参 this.r = r; } /*从缓存中读取一个字符返回给调用方。 * 如果缓存中不存在字符数据,就用被包装对象r * 到磁盘中去读取一堆数据放到缓存中。 */ public int read() throws IOException{ if(count==0){//缓存是空的,必须到磁盘中加载 count=r.read(buf); pos=0; } if(count<0){ //已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做) return -1; } char c=buf[pos]; count--; pos++; return c; } public String readLine() throws IOException{ StringBuilder sb=new StringBuilder(); int c=0; while((c=read())!=-1){ char ch=(char) c; if(ch=='\n'){ return sb.toString(); } sb.append(ch); } if(sb.length()!=0){//最后一行没有换行符,也要返回 return sb.toString(); } return null; } @Override public int read(char[] cbuf, int off, int len) throws IOException { return r.read(cbuf, off, len); } @Override public void close() throws IOException { r.close(); } } import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import org.junit.Test; //这个类和v1,v2版本都完全相同,没有变化 public class TestMyBufferedReader { @Test//我们开发的MyBufferedReader---read() public void testMyRead() throws IOException{ FileReader fr = new FileReader("a.txt"); MyBufferedReader br = new MyBufferedReader(fr); /* char c = (char) bfr.read(); System.out.println(c); */ int c; while((c=br.read())!=-1){ char ch=(char) c; System.out.print(ch); } System.out.println(); } @Test//MyBufferedReader---readLine() public void testMyReadLine() throws IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt")); MyBufferedReader br = new MyBufferedReader(isr); String str=null; while((str=br.readLine())!=null){ System.out.print(str); } System.out.println(); } }