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

------- android培训、 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){}
		}

		
	}

}




你可能感兴趣的:(BufferedWriter,文件拷贝)