第十二章 java流与文件操作 第二讲
二 缓冲字符流的应用 BufferedReader BufferedWriter
1.缓冲字符流出现的原因:FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。
2. 缓冲字符流的优点:是为了提高效率。
3. 缓冲字符的原理:就是对数组进行封装。因为在运用缓冲的过程中,在读取时是在调用read(),当调用的字符已满所定的内存时,就会封装成数组去访问磁盘文件。
4. 缓冲字符的构造方法:
public BufferedReader(Reader in);
注意:参数Reader是BufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性。
public BufferedReader(Reader in,int sz);
注意:int sz是制定缓冲区的内存容量
public BufferedWriter(Writer out) ;
public BufferedWriter(Writer out,int sz);
5.对缓冲字符流的实例的部分代码:----蓝色部分是会缓冲流的创建
FileWriterfw=null;
BufferedWriter bw=null;
try {
fw = new FileWriter("demo.txt");//字符的输出流,数据的写入
bw = new BufferedWriter(fw);//构建缓冲的字符流,对已有流的封装
bw.write("hell0");
bw.newLine();//增加换行符
bw.write("java");
bw.newLine();
bw.flush();//把缓冲区的内容刷新到目的地
}
6. 缓冲字符流有几个特有的方法:
public StringreadLine();
public void newLine();
对readLine()方法的使用的部分代码:
FileReader fr = null;
BufferedReader br= null;
try {
fr=newFileReader("res/demo.txt");
br = new BufferedReader(fr,255);//255指定缓冲区
String str= null;
while((str=br.readLine())!=null){
System.out.print(str);
}
7.在懂得缓冲流方法中的readLine()的原理后,可以根据原理自己创建一个缓冲流的类,下面是一个缓冲流类的实例:
import java.io.*;
public class MyBufferedReader {
//类的属性,代表普通 的字符输入流对象,修饰的对象
private Reader r;//利用自己类的父类可以接受子类,从而体现多态性
//构造方法
static int n=1;
public MyBufferedReader(Reader r){//体现多态性
this.r=r;
}
//readLine()方法:实现的功能是读一行,增加缓冲区,然后调用r对象的read()读取字符放在缓冲区中,
//当读到行标记时,就把缓冲区中的字符中的字符转换成字符串返回
public String readLine(){
//缓冲区
StringBuffer strB = newStringBuffer();
int ch = 0;
try {
while((ch=r.read())!=-1){
//'\r'和'\n'是回车换行,只有在两个都存在时才可实现
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return (n++)+"\t"+new String(strB);// 等价 strB.toString()
}else{
strB.append((char)ch);//追加放置在缓冲区里
}
}
} catch (IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
//当读到最后一行的时候,判断最后一行是否到结尾,是否有字符返回。
if((strB.length())!=0){
return newString(strB);
}
return null;
}
//close()方法
public void close(){
try {
r.close();
} catch (IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}
8.装饰设计模式和继承的区别
装饰设计模式比继承有更好的灵活性。因为装饰模式和继承相比,继承中的类在建立缓冲字符流时,是在每次使用时建立一个,这样的重复性会很大,如果用装饰模式,可以只建立一个类,只要在使用时调用它就行了。就好比是抽象类、接口一样,把共同的东西提前出来。
当然,每个事物都是有两方面的,有优点必定有缺点。
出现的新的问题:该类虽然完成对已有两个对象的增强。但是当有新的对象出现时,还要继续在该类中添加构造函数。这样不利于扩展和维护。
二 缓冲字符流的应用 BufferedReader BufferedWriter
1.缓冲字符流出现的原因:FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。
2. 缓冲字符流的优点:是为了提高效率。
3. 缓冲字符的原理:就是对数组进行封装。因为在运用缓冲的过程中,在读取时是在调用read(),当调用的字符已满所定的内存时,就会封装成数组去访问磁盘文件。
4. 缓冲字符的构造方法:
public BufferedReader(Reader in);
注意:参数Reader是BufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性。
public BufferedReader(Reader in, int sz);
注意:int sz 是制定缓冲区的内存容量
public BufferedWriter(Writer out) ;
public BufferedWriter(Writer out, int sz);
5.对缓冲字符流的实例的部分代码:----蓝色部分是会缓冲流的创建
FileWriter fw=null;
BufferedWriter bw=null;
try {
fw = new FileWriter("demo.txt");//字符的输出流,数据的写入
bw = new BufferedWriter(fw);//构建缓冲的字符流,对已有流的封装
bw.write("hell0");
bw.newLine();//增加换行符
bw.write("java");
bw.newLine();
bw.flush();//把缓冲区的内容刷新到目的地
}
6. 缓冲字符流有几个特有的方法:
public StringreadLine();
public void newLine();
对readLine()方法的使用的部分代码:
FileReader fr = null;
BufferedReader br= null;
try{
fr=newFileReader("res/demo.txt");
br = newBufferedReader(fr,255);//255指定缓冲区
String str= null;
while((str=br.readLine())!=null){
System.out.print(str);
}
7.在懂得缓冲流方法中的readLine()的原理后,可以根据原理自己创建一个缓冲流的类,下面是一个缓冲流类的实例:
import java.io.*;
public class MyBufferedReader{
//类的属性,代表普通的字符输入流对象,修饰的对象
private Reader r;//利用自己类的父类可以接受子类,从而体现多态性
//构造方法
static int n=1;
public MyBufferedReader(Reader r){//体现多态性
this.r=r;
}
//readLine()方法:实现的功能是读一行,增加缓冲区,然后调用r对象的read()读取字符放在缓冲区中,
//当读到行标记时,就把缓冲区中的字符中的字符转换成字符串返回
public String readLine(){
//缓冲区
StringBuffer strB = newStringBuffer();
int ch = 0;
try {
while((ch=r.read())!=-1){
//'\r'和'\n'是回车换行,只有在两个都存在时才可实现
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return (n++)+"\t"+new String(strB);// 等价 strB.toString()
}else{
strB.append((char)ch);//追加放置在缓冲区里
}
}
} catch (IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
//当读到最后一行的时候,判断最后一行是否到结尾,是否有字符返回。
if((strB.length())!=0){
return newString(strB);
}
return null;
}
//close()方法
public void close(){
try {
r.close();
} catch (IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}
8.装饰设计模式和继承的区别
装饰设计模式比继承有更好的灵活性。因为装饰模式和继承相比,继承中的类在建立缓冲字符流时,是在每次使用时建立一个,这样的重复性会很大,如果用装饰模式,可以只建立一个类,只要在使用时调用它就行了。就好比是抽象类、接口一样,把共同的东西提前出来。
当然,每个事物都是有两方面的,有优点必定有缺点。
出现的新的问题:该类虽然完成对已有两个对象的增强。但是当有新的对象出现时,还要继续在该类中添加构造函数。这样不利于扩展和维护。