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();
}
}