Java - 字符流缓冲区 - BufferedReader - BufferedWriter

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

}


你可能感兴趣的:(Java基础)