黑馬程序員_java對BufferedReader中readLine在拷貝文件時存在的問題的與改進方法。

------- 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){}
		}

		
	}

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章