public class BuffDemo {
/*
* 用缓冲区复制文件。
*
***/
public static void main(String[] args) throws Exception {
//创建读取流
FileReader fr = new FileReader("abc.txt");
//创建读取流缓冲区
BufferedReader bufr = new BufferedReader(fr);
//创建输出流
FileWriter fw = new FileWriter("abc6.txt");
//创建输出流缓冲区
BufferedWriter bufw = new BufferedWriter(fw);
String line = null;
while((line = bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();//养成好习惯
}
/*
//这个数组和缓冲区里的数组是不一样的,他是用来装从缓冲区数组读取的字符。也就是说每次从数组中取出10个字符。
char[] ch = new char[10];
int len = 0;
while((len=bufr.read(ch))!=-1){
bufw.write(ch);
bufw.flush();
}
*/
bufr.close();
bufw.close();
}
}
/****
* 用装饰设计模式 模仿BufferedReader功能,也就是模仿一个缓冲区。 BufferedReader的本质是对Reader流对象的功能扩展
*
* 分析: 缓冲区其实就是在缓冲区中封装了一个数组, 对外提供访问,操作数组的方法, 其实这些方法最终操作的都是数组的角标。
*
* BufferedReader的原理: 从源文件中读取数据存放在数组中
*
*
*/
public class MyBufferedReader{
private Reader r;
private char[] cbuf = new char[1024];
// 从源文件读取的字符数
int len = 0;
int i = 0;
MyBufferedReader(Reader r) {
this.r = r;
}
/*
* myread模仿了BufferedReader 的 read方法。其实他操作的是缓冲区的数组。
* 就是把源文件的数据读入数组中,然后一个一个的取出来。取完数组再接着读源文件。
* 如果源文件读完了,就返回-1.
*/
public int myread() throws IOException {
if (len == 0) {
len = r.read(cbuf);
i = 0;
}
if (len < 0) {
return -1;
}
char ch = cbuf[i];
i++;
len--;
return ch;
}
/*
* myreadLine模仿了BufferedReader 的 readLine方法 。其实他是调用BufferedReader 的 read方法
* read把源文件的数据存入数组,并一个一个返回。readLine把数组的数据存在了容器上。容器每次存储一行数据。
*
*/
StringBuilder sb = new StringBuilder();
public String myreadLine() throws IOException {
sb.delete(0, sb.length());
int ch = 0;
while((ch = myread())!=-1){
if(ch == '\r')
continue; //退出本次循环
if(ch=='\n')
// break; //退出循环
return sb.toString();
sb.append((char)ch);
}
if(sb.length()!=0){
return sb.toString();
}
return null;
}
}