`
jiao13953900900
  • 浏览: 32242 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

黑马程序员-IO_字符流缓冲区

    博客分类:
  • java
阅读更多

 

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

 

 

字符流缓冲区

 

 

缓冲区的出现是为了提高流的操作效率而出现的。

 

所以在创建缓冲区之前,必须要先有流对象。

 

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

newLine();

 

import java.io.*;

class  BufferedWriterDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个字符写入流对象。
		FileWriter fw = new FileWriter("buf.txt");

		//为了提高字符写入流效率。加入了缓冲技术。
		//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
		BufferedWriter bufw = new BufferedWriter(fw);

		for(int x=1; x<5; x++)
		{
			bufw.write("abcd"+x);
			bufw.newLine();//跨平台的换行符。
			bufw.flush();
		}

		//记住,只要用到缓冲区,就要记得刷新。
		//bufw.flush();

		//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
		bufw.close();


	}
}

 

 

字符读取流缓冲区:

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

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

 

readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

 

import java.io.*;

class  BufferedReaderDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个读取流对象和文件相关联。
		FileReader fr = new FileReader("buf.txt");

		//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
		BufferedReader bufr = new BufferedReader(fr);
		

		String line = null;
		//使用readLine方法一次读取一个文本行。
		while((line=bufr.readLine())!=null)
		{
			System.out.println(line);
		}
		bufr.close();
	}

}

 

 

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

 

import java.io.*;

class  CopyTextByBuf
{
	public static void main(String[] args) 
	{
		BufferedReader bufr = null;//在外部建立引用,内部创建对象。
		BufferedWriter bufw = null;

		try
		{
			bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
			bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));

			String line = null;
			//使用readLine方法读取一行。
			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("写入关闭失败");
			}
		}
	}
}

 

 

 

明白了BufferedReader类中特有方法readLine的原理后,

可以自定义一个类中包含一个功能和readLine一致的方法。

来模拟一下BufferedReader

 

import java.io.*;
class MyBufferedReader extends Reader
{
	
	private Reader r;
	//因为是对其他流进行装饰,所以接收一个流对象
	MyBufferedReader(Reader 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;		
	}

	/*
	覆盖Reader类中的抽象方法。
	*/
	public int read(char[] cbuf, int off, int len) throws IOException
	{
		return r.read(cbuf,off,len) ;
	}
	public void close()throws IOException
	{
		r.close();
	}
	public void myClose()throws IOException
	{
		r.close();
	}
}
class  MyBufferedReaderDemo
{
	public static void main(String[] args) throws IOException
	{
		FileReader fr = new FileReader("buf.txt");

		MyBufferedReader myBuf = new MyBufferedReader(fr);

		String line = null;
		//使用自己写的文件读取流缓冲区读取数据并打印到控制台上。
		while((line=myBuf.myReadLine())!=null)
		{
			System.out.println(line);
		}

		myBuf.myClose();
	}
}

 

LineNumberReader是可以对文本文件行号进行操作的文本输入流缓冲流。

 

import java.io.*;

class LineNumberReaderDemo 
{
	public static void main(String[] args)throws IOException 
	{
		FileReader fr = new FileReader("PersonDemo.java");

		LineNumberReader lnr = new LineNumberReader(fr);

		String line = null;
		lnr.setLineNumber(100);//设置行号从什么地方开始。
		while((line=lnr.readLine())!=null)
		{
			System.out.println(lnr.getLineNumber()+":"+line);//获取行号。打印到控制台上
		}
		lnr.close();
	}
}

 

 

通过对LineNumberReader进行了解,大致知道了其对行进行操作的原理。

自己写一个LineNumberReader类实现相同的功能。

 

练习:模拟一个带行号的缓冲区对象。

 

import java
//因为该类中有readLine方法,与BufferedReadre中需要实现相同的功能,并且具有自己特有的功能,所以继承自BufferedReader。
class MyLineNumberReader extends BufferedReader
{
	private int lineNumber;//定义一个变量,记录行号
	//接收一个流对象
	MyLineNumberReader(Reader r)
	{
		super(r);
	}
	//写一个readLine方法,具有该类特有的行计数功能,并调用父类的ReadLine对数据进行读取。
	public String ReadLine()throws IOException
	{
		lineNumber++;
		return super.ReadLine();
	}
	//写一个具有设置行号功能的方法
	public void setLineNumber(int lineNumber)
	{
		this.lineNumber = lineNumber;
	}
	//写一个具有获取行号功能的方法
	public int getLineNumber()
	{
		return lineNumber;
	}
}

 

 

 

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics