30号文件
来源:互联网 发布:淘宝比价软件哪个好用 编辑:程序博客网 时间:2024/04/23 19:34
课堂笔记
一、缓冲字符流的初步了解
1.使用目的:提高工作效率
2.工作原理:是对已经存在的流进行的操作,先将数据源的内容保存到一块连续的内存地址(联系数组),再在缓冲区对数据流进行操作。
3.常用方法:
※BufferedReader类
①public BufferedReader(Reader in) ;创建一个使用默认大小输入缓冲区的缓冲字符输入流
②public BufferedReader(Reader in, int sz) ;sz指输入缓冲区的大小,如果sz≤0,则抛出IllegalArgumentException异常
③特有方法:public String readLine() throws IOException:读取一个文本行,一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。
※BufferedWriter
①public BufferedWriter(Writer out) ;创建一个使用默认大小输入缓冲区的缓冲字符输出流
②public BufferedWriter(Writer out, int sz); sz指输入缓冲区的大小,如果sz≤0,则抛出IllegalArgumentException异常
③特有方法:public void newLine(); 写出平台相关的行分隔符来标记一行的终止。Windows平台下为’\n’
4.实质:使用缓冲的字符流时其实就是使用流对象的方法,只不过加入了数组,对数据进行了临时存储,为了提高操作数据的效率。
二、代码讲解
1.
import java.io.*;
public class MyBufferedReader {
//类中的属性
private Reader r;
//构造方法
public MyBufferedReader(Reader r){
this.r=r;
}
//readLine()方法:增加一个缓冲区。然后调用r对象的read()读取字符放到缓冲区,
//当读到标记时,把缓冲区的字符 转换成字符串返回
public String readLine(){
//缓冲区
StringBuffer strB=new StringBuffer();
int ch=0;
try {
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return new String(strB);//返回字符串
else
strB.append((char)ch);//追加内容,运用强制类型转换
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(strB.length()!=0)
return new String(strB);
return null;
}
//close()方法
public void close(){
try {
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.
import java.io.*;
public class BufferedIODemo2 {
public static void main(String[] arg){
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader("res/demo.txt");
br=new BufferedReader(fr,255);//参数是流
//255是指定的缓冲区得大小
String str=null;
while((str=br.readLine())!=null){
System.out.println(str);
}
等价于下面注释代码:
// str=br.readLine();
// while(str!=null){
// System.out.println(str);
// str=br.readLine();
// }
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
三、装饰设计模式和继承有什么区别?
答:装饰设计比继承更加灵活,不必对每个类都由子类去继承父类而加强其功能,装饰设计通过对缓冲技术和多态的运用,以父类作为操作对象,使程序设计更加便利。