关闭

黑马程序员_java对BufferedReader中readLine在拷贝文件时存在的问题的与改进方法。

标签: BufferedWriter文件拷贝
356人阅读 评论(0) 收藏 举报
------- android培训java培训、期待与您交流! ----------

</pre><p></p><p></p><p>在下面的用常规方法拷贝文件示例中,</p><p>存在当原文件最后一行没有换行时,程序会使拷贝文件换行。</p><p></p><p></p><pre name="code" class="java">import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 用缓冲区拷贝一个java文件。
 */
public class BufferedTest {

	public static void main(String[] args) {
		
		BufferedWriter bufw = null ;
		BufferedReader bufr = null ;
		try{                  //文件目录可以自己指定
			bufw = new BufferedWriter(new FileWriter("G:\\Stu_copy.java"));
			bufr = new BufferedReader(new FileReader("G:\\Stu.java"));
			String line = null ;
			while((line=bufr.readLine())!=null){
				bufw.write(line);
				bufw.newLine();  //如果原文件末尾没有换行,拷贝的文件也会再换一行。
				bufw.flush();
			}
		}catch(IOException e){}
		finally{
			try{
				if(bufw!=null)
					bufw.close();
			}catch(IOException e){}
			try{
				if(bufr!=null)
					bufr.close();
			}catch(IOException e){}
		}
		
		
	}

}

为了解决这种不完美,自己在重写一个自己想要的readLine读取方法,和调用者之间相互配合来弥补这种缺陷。

建立一个自己的BufferedReader.


package com.test;

import java.io.FileReader;
import java.io.IOException;

class MyBufferedReader {
	private FileReader fr ;
	private boolean flag =true ; //避免当原文件是个空文件时,拷贝的文件换行。
	MyBufferedReader(FileReader fr){
		this.fr = fr ;
	}
	
	public String myReadLine()throws IOException{
		StringBuilder sb = new StringBuilder();
		int len = 0 ;
		while((len=fr.read())!=-1){
			if(len=='\r')
				continue;
			if(len=='\n')
				return sb.toString();
			else{
				flag=false; //不是空文件,让标记改变,好让下面的返回的换行有可能语句执行到
				sb.append((char)len);
			}
		}
		if(sb.length()!= 0){ //原文件的就会一行有内容但没有换行
			flag=true;
			return sb.toString();
		}
		if(!flag){  //当源文件的最后一行没有内容,只是单纯的换行,那么返回换行原句使拷贝文件换行。
			flag=true;
			return "\r\n" ;
		}
		return null;	
	}
	public void myClose()throws IOException{
		fr.close();
	}
}


有了上面重写的类,下面的主函数就很好写了


package com.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 用缓冲区拷贝一个java文件。
 */
public class BufferedTest {

	public static void main(String[] args) {
		
		BufferedWriter bufw = null ;
		MyBufferedReader bufr = null ;

	try{
			bufw = new BufferedWriter(new FileWriter("G:\\Stu_copy.java"));
			bufr = new MyBufferedReader(new FileReader("G:\\Stu.java"));
			String line=bufr.myReadLine() ;
			while(line!=null){
				bufw.write(line);
				bufw.flush();
				if((line=bufr.myReadLine())!=null)
					if(!(line.equals("\r\n")))
						bufw.newLine();
			}
		}catch(IOException e){}
		finally{
			try{
				if(bufw!=null)
					bufw.close();
			}catch(IOException e){}
			try{
				if(bufr!=null)
					bufr.myClose();
			}catch(IOException e){}
		}

		
	}

}




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2448次
    • 积分:131
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章存档
    最新评论