第十二章 java流与文件操作 第二讲

本文深入探讨了Java中缓冲字符流的作用、原理及应用,包括构造方法、特殊方法和实例代码,同时介绍了装饰设计模式与继承的区别,并提供了一个自定义缓冲流类的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第十二章 java流与文件操作 第二讲

二 缓冲字符流的应用 BufferedReader BufferedWriter

1.缓冲字符流出现的原因:FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。

2. 缓冲字符流的优点:是为了提高效率。

3. 缓冲字符的原理:就是对数组进行封装。因为在运用缓冲的过程中,在读取时是在调用read(),当调用的字符已满所定的内存时,就会封装成数组去访问磁盘文件。

4. 缓冲字符的构造方法:

public BufferedReader(Readerin);

注意:参数ReaderBufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性。

public BufferedReader(Readerin, intsz);

注意:intsz 是制定缓冲区的内存容量

public BufferedWriter(Writerout) ;

public BufferedWriter(Writerout, intsz);

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 String readLine();

public void newLine();

对readLine()方法的使用的部分代码:

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.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 = new StringBuffer();

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) {

// 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();

}

}

}

8.装饰设计模式和继承的区别

装饰设计模式比继承有更好的灵活性。因为装饰模式和继承相比,继承中的类在建立缓冲字符流时,是在每次使用时建立一个,这样的重复性会很大,如果用装饰模式,可以只建立一个类,只要在使用时调用它就行了。就好比是抽象类、接口一样,把共同的东西提前出来。

当然,每个事物都是有两方面的,有优点必定有缺点。

出现的新的问题:该类虽然完成对已有两个对象的增强。但是当有新的对象出现时,还要继续在该类中添加构造函数。这样不利于扩展和维护。

二 缓冲字符流的应用 BufferedReader BufferedWriter

1.缓冲字符流出现的原因:FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。

2. 缓冲字符流的优点:是为了提高效率。

3. 缓冲字符的原理:就是对数组进行封装。因为在运用缓冲的过程中,在读取时是在调用read(),当调用的字符已满所定的内存时,就会封装成数组去访问磁盘文件。

4. 缓冲字符的构造方法:

public BufferedReader(Readerin);

注意:参数ReaderBufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性。

public BufferedReader(Readerin, intsz);

注意:intsz 是制定缓冲区的内存容量

public BufferedWriter(Writerout) ;

public BufferedWriter(Writerout, intsz);

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 String readLine();

public void newLine();

对readLine()方法的使用的部分代码:

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.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 = new StringBuffer();

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) {

// 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();

}

}

}

8.装饰设计模式和继承的区别

装饰设计模式比继承有更好的灵活性。因为装饰模式和继承相比,继承中的类在建立缓冲字符流时,是在每次使用时建立一个,这样的重复性会很大,如果用装饰模式,可以只建立一个类,只要在使用时调用它就行了。就好比是抽象类、接口一样,把共同的东西提前出来。

当然,每个事物都是有两方面的,有优点必定有缺点。

出现的新的问题:该类虽然完成对已有两个对象的增强。但是当有新的对象出现时,还要继续在该类中添加构造函数。这样不利于扩展和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值