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

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


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

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


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

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

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

一、IO流概述 概述:          IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,java对于数据的操作都是通过流实现,而java用于操作流的对象都在I...
  • u010041075
  • u010041075
  • 2015年10月09日 21:54
  • 2240

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

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

21-IO流-14-IO流(字符流-缓冲区-BufferedReader-readLine方法原理)

打开API,找到java.io包,发现如BufferedReader类,将父类Reader中的某些方法进行了复写,如close、read等等。      在Reader类中,点开read方法,发现...
  • wy_0928
  • wy_0928
  • 2015年08月11日 10:49
  • 383

复制文本文件字符流的5种方式

package cn.itcast_01;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File...
  • Sofia_Li_
  • Sofia_Li_
  • 2018年01月19日 10:21
  • 42

黑马程序员_Java基础_IO流_字节流,字节流操作文件,缓冲区字节流,流的使用规律,异常记录原理

一,字节流 字节流顾名思义就是操作字节的流。字节流是可以操作任意数据的,比如说媒体数据,音乐,电影,图片等,当然它也是可以操作字符的。字符流就是基于字节流来实现的,我们知道一个字节是8个二进...
  • u013432047
  • u013432047
  • 2014年05月20日 22:45
  • 1183

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上...
  • qq_26787115
  • qq_26787115
  • 2016年07月02日 17:57
  • 3905

使用缓冲区复制文本文件及readLine()原理

package buffered.demo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io....
  • fandoudou123
  • fandoudou123
  • 2015年09月14日 17:17
  • 397

字符流缓冲区

1.BufferedWriter示例:
  • u010834071
  • u010834071
  • 2014年07月28日 15:19
  • 528

黑马程序员_字符流的缓冲区

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------   字符流的缓冲区  1.缓冲区的出现提高了对数据的读写效率,所...
  • wzy_841758518
  • wzy_841758518
  • 2012年05月17日 11:10
  • 163

字符流以及字符流缓冲区实例

这几天再次学习了IO的相关内容,感觉比以前的思路更加清晰了点。 IO按照流的分类可以分为字节流(XXXStream)和字符流(XXXRreader、XXXWriter)。 字符流主要是操作文本文件,这...
  • u011521890
  • u011521890
  • 2015年09月19日 22:39
  • 378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IO_02_字符流的缓冲区
举报原因:
原因补充:

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