IO流(二)——BufferedWriter、BufferedReader、LineNumberReader

一、BufferedWriter示例

public class BufferedWriterDemo {

	private static final String LINE_SEPARATOR = System.getProperty("line.separator");

	public static void main(String[] args) throws IOException {
                FileWriter fw = new FileWriter("buf.txt");

		//为了提高写入的效率。使用了字符流的缓冲区。
		//创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
		BufferedWriter bufw = new BufferedWriter(fw);
		
		//使用缓冲区的写入方法将数据先写入到缓冲区中。
		for(int x=1; x<=4; x++){
			bufw.write("abcdef"+x);
			bufw.newLine();
                        //使用缓冲区的刷新方法将数据刷目的地中。
		        bufw.flush();
		}
		
		//关闭缓冲区。其实关闭的就是被缓冲的流对象。
		bufw.close();
	}

}

运行结果:
 

 

二、BufferedReader示例

public class BufferedReaderDemo {
	public static void main(String[] args) throws IOException {

		FileReader fr = new FileReader("buf.txt");
		
		BufferedReader bufr = new BufferedReader(fr);
		
		String line = null;
		
		while((line=bufr.readLine())!=null){
			System.out.println(line);//读取一行,以回车符为分界线
		}

		bufr.close();
		
		
	}
}

运行结果:

 

三、自定义的读取缓冲区,模拟一个BufferedReader类

思路:

缓冲区中无非就是封装了一个数组,并对外提供了更多的方法对数组进行访问,其实这些方法最终操作的都是数组的角标。

缓冲的原理:其实就是从源中获取一批数据装进缓冲区中,在从缓冲区中不断的取出一个一个数据,在此次取完后,在从源中继续取一批数据进缓冲区,当源中的数据取光时,用-1作为结束标记。 

public class MyBufferedReader extends Reader {

	private Reader r;
	
	//定义一个数组作为缓冲区。
	private char[] buf = new char[1024];
	
	//定义一个指针用于操作这个数组中的元素。当操作到最后一个元素后,指针应该归零。	
	private int pos = 0;	
	
	
	//定义一个计数器用于记录缓冲区中的数据个数。 当该数据减到0,就从源中继续获取数据到缓冲区中。
	private int count = 0;
	
	
	MyBufferedReader(Reader r){
		this.r = r;
	}
	
	/**
	 * 该方法从缓冲区中一次取一个字符。 
	 * @return
	 * @throws IOException
	 */
	public int myRead() throws IOException{
		//1,从源中获取一批数据到缓冲区中。需要先做判断,只有计数器为0时,才需要从源中获取数据。
		if(count==0){
			count = r.read(buf);
			pos = 0;
		}
		if(count<0)
			return -1;
		
		char ch = buf[pos++];
		
		count--;
		
		return ch;
		
	}
	
	public String myReadLine() throws IOException{
		
		StringBuilder sb = new StringBuilder();
		
		int ch = 0;
		while((ch = myRead())!=-1){
			
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return sb.toString();
			//将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中。
			sb.append((char)ch);
			
		}		
		//假设最后一个字符不是回车符,则缓冲池的长度不为,所以继续返回缓冲池中的数据
		if(sb.length()!=0)
			return sb.toString();
		return null;
	}

	public void myClose() throws IOException {
		
		r.close();
	}

	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		
		return 0;
	}

	@Override
	public void close() throws IOException {
	}
}

测试代码:

public class MyBufferedReaderDemo {
	public static void main(String[] args) throws IOException {

		FileReader fr = new FileReader("C:\\Demo.txt");
		
		MyBufferedReader bufr = new MyBufferedReader(fr);
		
		String line = null;
		
		while((line=bufr.myReadLine())!=null){
			System.out.println(line);
		}
		
		bufr.myClose();
			
		
	}

}

运行结果:

 

四、LineNumberReader示例

1,LineNumberReader是BufferedReader的子类,是BufferedReader的装饰设计模式

2,可以读取到行号

3,方法示例

setLineNumber(n)//设置行号从第n行开始
getLineNumber()//获取行号

4,代码示例:

public class LineNumberReaderDemo {

	public static void main(String[] args) throws IOException {

		FileReader fr = new FileReader("C:\\Demo.txt");
		LineNumberReader lnr = new LineNumberReader(fr);
		
		String line = null;
		lnr.setLineNumber(5);//设置行号从第5行开始
		while((line=lnr.readLine())!=null){
			System.out.println(lnr.getLineNumber()+":"+line);//获取行号
		}
		
		lnr.close();
	}

运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值