今天看了毕老师的MyBufferedReader视频教程, 自己写一遍.

今天看了毕老师的MyBufferedReader视频教程, 看完了自己写了一遍, 感受了一下; 视频中毕老师是把结果打印在控制台了, 我稍微修改了一下, 做成了复制文件;

代码中加了很多注释, 但是页面中的注释没有标识特殊颜色, 很不方便阅读, 浪费我一片苦心.



import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class MyBufferedReaderDemo {

	/**  通过自己写的MyBufferedReader来复制文件
	 * @param args
	 * @author 啊悦
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyBufferedReader mbr = null;   //定义一个MyBufferedReader, 并初始化;
		
		
		//实例化MyBufferedReader
		try {
			mbr = new MyBufferedReader(new FileReader("D:\\123.txt"));	//"D:\\123.txt"是要被复制的原文件的路径, 因为是windows环境, 所以路径是双反斜杠
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//定义一个FileWriter
		FileWriter fw = null;
		
		//实例化FileWriter
		try {
			fw = new FileWriter("D:\\123_copy.txt");	//"D:\\123.txt"是要复制的目标文件的路径, 因为是windows环境, 所以路径是双反斜杠
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		//把MyBufferedReader读取到的数据通过fw写入到文件
		String s = null;
		try {
			while((s=mbr.MyReadLine())!=null){
				fw.write(s);
				fw.write("\r\n");	//手动输入的换行, 只在windows下有效; 并且这句还有点问题: 如果被复制的原文件不是以换行结尾的,
									//那么目标文件会多出一个换行. 如果原文件是以换行结尾的, 则不会多出一个换行.
//				System.out.println(s);  //调试语句, 打印读到到的每一行. 注意,打印语句加了换行.
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//无论是否写入成功, 均要关闭读取流和写入流
		finally{
			try {
				fw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				mbr.MyClose();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}
	}
}
	
	
	
	
	class MyBufferedReader{
			private FileReader fr;
			
			//构造方法, 要求传递一个FileReader
			MyBufferedReader(FileReader fr){
				this.fr = fr;
			}
			
			//自定义MyReadLine方法, 尽情的抛异常吧, 谁调用谁处理;
			String MyReadLine() throws IOException{
				StringBuilder sb = new StringBuilder();
				int len = 0;
				
				//单个字符读取传递进来的FileReader
				while((len=fr.read())!=-1){
					//如果读到\r则直接进入下一次循环
					if(len=='\r'){
						continue;
					}
					
					//如果读到\n表示已经读完了一行, 那么就返回这一行:sb.toString(); 否则就把读到的字符放到sb;
					//如果文件最后一行没有换行, 那么会漏掉最后一行;
					if(len=='\n'){
						return sb.toString();
					}
					else{
						sb.append((char)len);					
					}
				}
				
				//处理"如果文件最后一行没有换行, 那么会漏掉最后一行;"这个情况, 如果sb里仍然存在字符, 那么再返回一次;
				if(sb.length()!=0){
					return sb.toString();
				}
				
				return null;
			}
			
			void MyClose() throws IOException{
				fr.close();
			}
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值