1…缓冲区
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
2…BufferedWrite
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。将文件的数据存入缓冲区,缓冲区数据存得差不多后就一次性取出去,,流对象就是水流,方便利用水流就建个蓄水池,让水流到蓄水池里面来,蓄水池满了我给他清空一次,再往里面流,如果没有水流那么建蓄水池就没有意义
构造方法摘要
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
发现没有无参构造函数因为缓冲区的出现是为了提高流的效率,所以缓冲区出现之前得先有流....流对象就是水流,方便利用水流就建个蓄水池,让水流到蓄水池里面来,蓄水池满了我给他清空一次,再往里面流,如果没有水流那么建蓄水池就没有意义
方法:
voidnewLine()
写入一个行分隔符。
代码;
/创建一个字符写入流对象
FileWriterfw = new FileWriter("buf.txt");
//为了提高字符写入流的效率。加入了缓冲技术。缓冲技术的原理是BufferedWriter对象里面封装了数组,把数组封装起来变成对象,先把数据都存起来,存完以后再一次性的写出去,,
//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriterbufw = new BufferedWriter(fw);
bufw.write("sdsdasdsa"); 此时目的地的文件buf.txt里面没有数据,因为没有做falush动作,把缓冲区里面的数据刷新到目的地文件里
//记住,只要用到缓冲区,就要记得刷新。
bufw.flush(); 此时目的地的文件buf.txt里面有数据了,
//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
bufw.close();
3…字符读取流缓冲区:
构造方法摘要
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
在进行BufferedReader对象建立的时候也要有个被缓冲的fielReader对象
方法:
intread(char[] cbuf, int off, int len)
将字符读入数组的某一部分。 把读取到的数据存放到数组中
String readLine() 每次读取文件里的一行数据
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
代码:
//创建一个读取流对象和文件相关联。
FileReaderfr = new FileReader("buf.txt");
//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReaderbufr = new BufferedReader(fr);
Stringline = null;
while((line=bufr.readLine())!=null) 循环条件,readLine()如果读到流末尾就没有数据了,则返回 null
{
System.out.print(line);
}
bufr.close();
注释:
readline方法的原理:
不管是一行行的读还是一次读多个字符,他最终都是从硬盘上一个个的取,所以这个readline最终还是使用read()方法
无论是读一行或者读取多个字符,其实最终都是在硬盘上一个一个的读取,所以readline最终使用的还是read()方法(一次读一个)
4...装饰设计模式
当想要对已有的对象进行功能增强时,
可以定义一个类,将已有对象传入,基于已有对象的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
代码:
class Person
{
publicvoid chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson 自定义一个类对原有的对象进行功能的增强
{
privatePerson p ;
SuperPerson(Personp) 想增强谁,就把谁传进来,,,我要增强谁,你得告诉我,,这个uperPerson对象是为了增强别人而存在的,那么就是得先有了别人之后uperPerson才能存在,
{
this.p= p;
}
publicvoid superChifan() 对人吃饭的功能进行增强
{
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
5..装饰设计模式和继承的区别
MyReader//专门用于读取数据的类。MyReader是自定义的对象,,发现数据有很多种,为了去分别描述对不同数据的读取方式,所以就建立了很多具体的一些事物描述比如下面的三个子类,这三个子类都有读的行为,只是读的方式不一样
|--MyTextReader
|--MyBufferTextReader
|--MyMediaReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader
发现这些子类读的效率低我就想到让他们提高效率,就想到缓冲技术,比如就对MyTextReader类延伸了一个子类MyBufferTextReader,对这子类加入缓冲技术就可以对MyTextReader
的功能进行重写,,
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式。可以提高扩展性。
class MyBufferReader
{
MyBufferReader(MyTextReadertext) 传入一个被提高效率的对象,,就是MyTextReader需要被提高效率
{}
MyBufferReader(MyMediaReadermedia) MyMediaReader 也需要增强
{}
}
class MyBufferReader extends MyReader 这个类是带着缓冲技术的Reader,,这个类最重要的方式是要缓冲这个Reader,增强Reader里的读取方法er
{
privateMyReader r;
MyBufferReader(MyReaderr) 传入父类类型,
{}
}
MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader这个类里面没有自己的东西,他是基于上面三个类进行了功能增强,增强完这个类MyBufferReader还是读,所以MyBufferReader是MyReader的子类
以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。
现在优化思想。单独描述一下缓冲内容。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。
通过装饰的模式来扩展MyDataReader等子类的功能
装饰模式比继承要灵活。避免了继承体系的臃肿。
而且降低了类于类之间的关系。以前是MyBufferTextReader缓冲区类必须得继承MyTextReader才行
装饰类因为增强已有对象,具备的功能和已有对象的功能是相同的,只不过是提供了更强功能。
所以装饰类(MyBufferReader)和被装饰类(MyTextReader)通常都属于一个体系中的。