黑马程序员-day19-IO流(字符流的缓冲区)

------- android培训java培训、期待与您交流! ----------

字符流的缓冲区
1.缓冲区的出现提高了对数据的读写效率。
2.对应类
BufferedWriter
BufferedReader
3.缓冲区要结合流才可以使用。
4.在流的基础上对流的功能进行了增强。

BufferedWriter(字符写入流缓冲区)
特点:
1.缓冲区中提供了一个跨平台的换行符。newLine();
2.close方法会在关闭该输入流之前先刷新一下该缓冲流
3.关闭缓冲区,就是在关闭缓冲区中的流对象。

BufferedWriter实例:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 缓冲区的出现是为了提高流的操作效率而出现的。
 */
public class BufferedWriterDemo {
	public static void main(String[] args) {
		FileWriter fw = null;
		BufferedWriter bw = null;
		try {
			fw = new FileWriter("HelloWorld.txt");
			//为了提高字符写入流效率。加入了缓冲技术。
			//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函

数即可。
			bw = new BufferedWriter(fw);
			bw.write("BufferedWrited demo");
			//写入一个跨平台的换行符.
			bw.newLine();
			//记住,只要用到缓冲区,就要记得刷新。
			bw.flush();
			bw.write("Java");
		} catch (IOException e) {
			System.out.println("数据写入失败");
		} finally{
			if (bw!=null) {
				try {
					//其实关闭缓冲区,就是在关闭缓冲区中的流对

象。
					bw.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}	
			}
			if (fw!=null) {
				try {
					fw.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}	
			}
		}
	}
}


BufferedReader(字符读取流缓冲区)
特有方法:
readLine:读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 

BufferedReader实例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/*
 * 字符读取流缓冲区
 */
public class BufferedReaderDemo {
	public static void main(String[] args) {
		FileReader fr = null;
		BufferedReader br = null;
		try{
			fr = new FileReader("HelloWorld.txt");
			br = new BufferedReader(fr);
			
			String line;
			while((line = br.readLine()) != null){
				System.out.println(line);
			}
		} catch(IOException e){
			System.out.println("读取失败");
		} finally{
			if (br!=null) {
				try {
					//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
					br.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}	
			}else if (fr!=null) {
				try {
					fr.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}	
			}
		}
	}
}


文本文件复制(通过缓冲区)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


/*
 * 通过缓冲区复制文件
 */
public class CopyTextBuffered {
	public static void main(String[] args){
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			br = new BufferedReader(new FileReader("HelloWorld.txt"));
			bw = new BufferedWriter(new FileWriter("HelloWorld_copy.txt"));
			String line;
			while((line = br.readLine()) != null){
				bw.write(line);
				bw.newLine();
			}
		} catch (IOException e) {
			System.out.println("复制失败");
		} finally{
			if(br!=null){
				try {
					br.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
			}
			if(bw!=null){
				try {
					bw.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
			}
		}
	}
}


readLine的原理:
不论是读一行,获取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是 read() 方法一次读一个的方法。
因为跨平台性,换行符不一样,所以读取的时候缓存中不存入换行,让使用者自己输入换行。

模拟BufferedReader中的readLine方法
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/*
明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法。
来模拟一下BufferedReader
*/
//模拟BufferedReader
class MyBufferedReader extends Reader{
	private Reader r;
	
	MyBufferedReader(Reader r) {
		this.r = r;
	}
	
	//readLine
	public String readLine() throws IOException{
		//定义一个临时容器。原BufferReader封装的是字符数组。
		//为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
		StringBuilder sb = new StringBuilder();
		int ch;
		while((ch = r.read())!=-1){
			if(ch=='\r'){
				continue;
			}
			if(ch=='\n'){
				return sb.toString();
			}else{
				sb.append((char)ch);
			}
		}
		if(sb.length() == 0){
			return null;
		}
		return sb.toString();
	}

	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		// TODO Auto-generated method stub
		return r.read(chuf,off,len);
	}

	@Override
	public void close() throws IOException {
		// TODO Auto-generated method stub
		r.close();
	}
	
}

public class MyBufferedReaderDemo {
	public static void main(String[] args) {
		MyBufferedReader br = null;
		try {
			br = new MyBufferedReader(new FileReader("HelloWorld.txt"));
			String line;
			while ((line=br.readLine())!=null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			System.out.println("读取失败");
		} finally{
			try {
				br.close();
			} catch (IOException e) {
				System.out.println(e.getMessage());
			}
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值