缓冲区 readLine 模拟缓冲区 LineNumberReader 模拟行号装饰

缓冲区

为了提高流的读写操作效率而出现的
所以在创建缓冲区之前,必须要现有流对象。

该缓冲区中,提供了一个快平台的换行符。

BufferedWriter

BufferedReader


字符写入缓冲区:

BufferedWriter

newLine()换行符。java中通用。

bufw.flush();刷新!

bufw.close();关闭缓冲区,就是关闭缓冲区中的流对象

不再需要单独关闭字符流!!!!


字符读取缓冲区:

BufferedReader

bufr.readLine(); 读取整行。

该缓冲区,提供了一个一次读一行的方法readLine();放便于对文本数据的获取,

当返回null时,表示读到文件的末尾。

readLine()方法返回的时候,

只返回回车符之前的数据内容,并不返回回车符

import java.io.*;
class Test
{
	public static void main(String[] args)	throws IOException 
	{
		//创建一个字符写入流对象
		FileWriter fw = new FileWriter("hello.java");
		//为了提高自负写入流效率,加入类缓冲技术,
		//只要将要被提高效率的流对象传递给缓冲区的构造函数即可。
		BufferedWriter bufw = new BufferedWriter(fw);
		bufw.write("abcdefg");
		//换行符newLine();
		bufw.newLine();
		//记住,只要用到缓冲区,就要记着刷新
		bufw.flush();
		//关闭缓冲区,就是关闭缓冲区的流对象。
		bufw.close();
		fw.close();

		//创建一个都去流对象和文件相关联。
		FileReader fr = new FileReader("2.java");
		//为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数。
		BufferedReader bufr2 = new BufferedReader(fr);
		
		String line = null;
		while ((line=bufr2.readLine())!=null)
		{
			sop(line);
		}
		bufr2.close();
	}
	public static void sop( Object obj)
	{
		System.out.println(obj);
	}
}

通过缓冲区复制一个.java文件

/*
通过缓冲区复制一个.java文件
*/
import java.io.*;
class Test
{
	public static void main(String[] args)
	{
		BufferedReader bufr = null;
		BufferedWriter bufw = null;
		try
		{
			bufr=new BufferedReader(new FileReader("2.java"));
			bufw=new BufferedWriter(new FileWriter("hello.java"));
			String line = null;
			while((line = bufr.readLine())!=null);
			{
				bufw.write(line);
				bufw.newLine();
				bufw.flush();
			}		
		}
		catch (IOException e)
		{
			throw new RuntimeException ("读写失败");
		}
		finally
		{
				try
				{
					if (bufr!=null)
						bufr.close();
				}
				catch (IOException  e)
				{
					throw new RuntimeException("出现错误");
				}
				try
				{
					if (bufw!=null)
						bufw.close();
				}
				catch (IOException  e)
				{
					throw new RuntimeException("出现错误");
				}
		}
	}
	public static void sop( Object obj)
	{System.out.println(obj);}
}
readLine 方法原理
无论是都一行,获取读取多个字符。其实最终都是在硬盘上一个一个的读取,
所以最终使用的还是read放发一次读一个的方法。

模拟缓冲区

/*
明白了BufferedReader类中特有方法readLine的原理后
可以自定义一个类中包含一个功能和readLine一直的方法。
来模拟BufferReader。
*/	
import java.io.*;
class Test
{
	public static void main(String[] args) throws IOException 
	{
		FileReader fr=new FileReader("1.java");
		MyBufferedReader mybuf = new MyBufferedReader(fr);
		String line=null;
		while ((line=mybuf.myReadLine())!=null)
		{
			sop(line);
		}
	mybuf.myclose();
	}

	public static void sop( Object obj)
	{
		System.out.println(obj);
	}
}
class MyBufferedReader
{
	private FileReader r;
	MyBufferedReader(FileReader r)
		{
			this.r = r;
		}
	//可以一次读一行数据的方法
	public String myReadLine() throws IOException 
	{
		//定义一个临时容器,原BufferReader封装的是字符数组
		//为了方便演示,定义一个StringBuilder容器,因为最终还是要将数据变成字符串
		StringBuilder sb = new StringBuilder();
		int  ch =0;
		while ((ch=r.read())!=-1)
		{
			if (ch=='\r')
				continue ;
			  if(ch=='\n')
				  return sb.toString();
				else
					sb.append((char)ch);
		}
		if (sb.length()!=0)
			return sb.toString();
		return null;
	}

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

setLineNumber(int);默认从0开始。
getLineNumber();

import java.io.*;
class Test
{
	public static void main(String[] args) throws IOException
	{
		FileReader fr = new FileReader("1.java");

		LineNumberReader lnr = new LineNumberReader(fr);
		String line =null;
		lnr.setLineNumber(1000);//行号初始化值
		while ((line = lnr.readLine())!=null)
		{
			sop(lnr.getLineNumber()+"::"+line);//显示行号
		}
		lnr.close();
	}
	public static void sop( Object obj)
	{
		System.out.println(obj);
	}
}
模拟行号装饰
import java.io.*;
class Test
{
	public static void main(String[] args) throws IOException
	{
		FileReader fr = new FileReader("1.java");

		MyLineNumberReader Mylnr = new MyLineNumberReader(fr);
		String line = null;
		Mylnr.setLineNumber(100);
		while((line=Mylnr.myReadLine())!=null)
		{
			sop(Mylnr.getLineNumber()+"::"+line);
		}
		Mylnr.myclose();
	}
	public static void sop( Object obj)
	{
		System.out.println(obj);
	}
}
class MyLineNumberReader 
{
	private Reader r;
	private int lineNumber;
	MyLineNumberReader(Reader r)
	{
		this.r = r;
	}
	public String myReadLine() throws IOException
	{
		lineNumber++;
		StringBuilder sb = new StringBuilder();
		int ch =0;
		while ((ch=r.read())!=-1)
		{
			if (ch=='\r')
				continue;
				if( ch=='\n')
					return sb.toString();
				else 
					sb.append((char)ch);
		}
		if(sb.length()!=0)
			return sb.toString();
		return null;
	}
	public void setLineNumber(int lineNumber)
	{
		this.lineNumber = lineNumber;
	}
	public int getLineNumber()
	{
		return lineNumber;
	}
	public void myclose() throws IOException
	{
		r.close();
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值