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