IO_02_字符流的缓冲区

原创 2016年08月21日 09:00:42

字符读取流缓冲区

缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
该缓冲区中提供了一个跨平台的换行符。
newLine();

class  BufferedWriterDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个字符写入流对象。
		FileWriter fw = new FileWriter("src\\com\\buffered\\writer\\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方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

class  BufferedReaderDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个读取流对象和文件相关联。
		FileReader fr = new FileReader("src\\com\\buffered\\ref\\buf.txt");
		//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
		BufferedReader bufr = new BufferedReader(fr);
		String line = null;
		while((line=bufr.readLine())!=null)
		{
			System.out.print(line);
		}
		bufr.close();
	}
}

明白了BufferedReader类中特有方法readLine的原理后,可以自定义一个类中包含一个功能和readLine一致的方法。来模拟一下BufferedReader

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("src\\com\\buffered\\ref\\buf.txt");

		MyBufferedReader myBuf = new MyBufferedReader(fr);

		String line = null;

		while((line=myBuf.myReadLine())!=null)
		{
			System.out.println(line);
		}

		myBuf.myClose();
	}
}
通过缓冲区复制一个.java文件。

class  CopyTextByBuf
{
	public static void main(String[] args) 
	{
		BufferedReader bufr = null;
		BufferedWriter bufw = null;

		try
		{
			bufr = new BufferedReader(new FileReader("src\\com\\buffered\\ref\\buf.txt"));
			bufw = new BufferedWriter(new FileWriter("src\\com\\buffered\\ref\\bufWriter_Copy.txt"));

			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("写入关闭失败");
			}
		}
	}
}


实际BufferReader是包装了FileReader,采用的装饰设计模式

装饰与继承

MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyBufferTextReader
|--MyMediaReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader


class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaReader media)
{}
}
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式。可以提高扩展性。


class MyBufferReader extends MyReader
{
private MyReader r;
MyBufferReader(MyReader r)
{}
}


MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader

以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。


现在优化思想。单独描述一下缓冲内容。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。

装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。


装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

字符流FileWriter,FileReader、缓冲区,BufferReader,BufferWriter,IO的简单异常处理

输入流和输出流相对于内容设备而言 将外设中的数据读取到内存中:输入 将内存的数写入到外设中:输出 字符流的由来: 字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。 再对这...

21.IO学习——字符流(3)——缓冲区…

字符——缓冲区: 1.BufferedWriter类     1)概述     父类为Writer,将文本写入字符输出流,缓冲各个字符,从而   提供单个字符。数组和字符串的高效写入。     给类提...

Java_io体系之BufferedReader、BufferedWriter字符流缓冲区

一、BufferedReader  BufferedReader由Reader类扩展而来,从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 1、方法摘要 2、方法...

java IO 二(字符流缓冲区)

上一篇内容java IO 一 (读写字符串)使用BufferedReader和BufferedWriter实现一个文本文件的复制private static void copy() { ...

java io 学习之三 字符流的缓冲区

/** 字符流的缓冲区 缓冲区的出现,提高了对数据的读写效率 对应的类: BufferedWriter BufferedReader 缓冲区要结合流才可以使用 缓冲区是在流的基础上对流的功能进行增强 ...

IO流上:概述、字符流、缓冲区(java基础)

一、IO流概述 概述:          IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,java对于数据的操作都是通过流实现,而java用于操作...

IO流:概述、字符流、缓冲区

转:https://www.cnblogs.com/xll1025/p/6418766.html 一、IO流概述 概述:          IO流简单来说就是Input和Output...

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

1.BufferdWriter

黑马程序员_IO流-字符流的的缓冲区学习(三)

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

IO流字符流-缓冲区

———– android培训、 java培训、java学习型技术博客、期待与您交流! ——-字符流的缓冲区 1:缓冲区的出现提高了对数据的读写效率。 2:对应类 (1):Buffer...
  • xdd_lmd
  • xdd_lmd
  • 2016年01月05日 00:19
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IO_02_字符流的缓冲区
举报原因:
原因补充:

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