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

原创 2015年11月20日 21:14:28
------- 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){}
		}

		
	}

}




黑马程序员——Java基础——IO流(模拟BufferedReader类中的readLine()方法)

------- android培训、java培训、期待与您交流! ----------

黑马程序员 —— BufferedReader的readLine()方法

------- android培训、java培训、期待与您交流! ---------- 今天复习到写一个文本转化器,客户端发一行字符,服务端转为大写后发回来。 前一天我写的时候,还是没问题...
  • Lin1i1y
  • Lin1i1y
  • 2015年02月02日 17:19
  • 3188

Java:bufferedReader.readLine()读取文件换行问题

var flag = 1; window.wb = function() { var as = document.getElementsByClassName("J_RefreshStatus");...
  • undoner
  • undoner
  • 2013年11月07日 16:43
  • 5740

黑马程序员——Java基础——IO流笔记(BufferedReader使用示例)

------- android培训、java培训、期待与您交流! ----------

黑马程序员_Java基础_05数组数组拷贝、数据常见问题

一、什么是数组以及数组常见操作 数组:同一类型数据的集合。就是一个存储数据的容器。 特点:  可以对数组中的每一个元素进行编号,从0开始;这样方便对数组中的元素进行操作。 通过数组的leng...

黑马程序员---2015.6.24java基础笔记--FileWriter- FileReader-BufferedWriter-BufferedReader

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- IO--FileWriter FileReader BufferedWriter Buff...

黑马程序员_java_IO流_FileWriter_FileReader_BufferedWriter_BufferedReader_IO异常

------- android培训、java培训、期待与您交流! ---------- 一、IO概述 IO流用来处理设备之间的数据传输 java对数据的操作是通过流的方式 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员_java对BufferedReader中readLine在拷贝文件时存在的问题的与改进方法。
举报原因:
原因补充:

(最多只允许输入30个字)