黑马程序员——IO流(字符流、包装设计模式)

来源:互联网 发布:外汇决策软件 编辑:程序博客网 时间:2024/05/22 15:33


-----------android培训java培训、java学习型技术博客、期待与您交流!------------

IO流(BufferedWriter)

字符流的缓冲区:

对应类

BufferedWriter

BufferedReader

缓冲区要结合流才可以使用。

在流的基础上对流的功能进行了增强。

类BufferedWriter

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

缓冲区的出现是为了提高流的操作效率而出现的。

所以在创建缓冲区之前,必须要先有流对象。


特殊方法:

跨平台换行符。

void newLine() 写入一个行分隔符。


BufferedReader:

String readLine()

读取一个文本行。

返回:包含该行内容的字符串,不包含任何行终止符,如果已达到流末尾,则返回null。

/* 字符读取流缓冲区: 该缓冲区提供了一个一次读一行的方法readLine,方便与对文本数据的获取。 当返回null时,表示读到文件末尾。 */import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class BufferedReaderDemo {public static void main(String[] args) throws IOException {//创建一个读取流对象和文件相关联。FileReader fr = new FileReader(".\\src\\BufferedReaderDemo.java");//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。BufferedReader bufr = new BufferedReader(fr);String line = null;while((line=bufr.readLine())!=null)System.out.println(line);bufr.close();}}

练习:

通过缓冲区复制一个.java文件。

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class CopyTextByBuf {public static void main(String[] args) {FileReader fr =null;BufferedReader br=null;FileWriter fw = null;BufferedWriter bw=null;try {fr = new FileReader(".\\src\\CopyTextByBuf.java");br = new BufferedReader(fr);fw = new FileWriter("CopyTextByBuf.java");bw = new BufferedWriter(fw);String frstr ;while((frstr=br.readLine())!=null){bw.write(frstr+System.lineSeparator());//bw.newLine();bw.flush();System.out.print(frstr+System.lineSeparator());}} catch (IOException e) {throw new RuntimeException("读写失败");}finally{try {if(br!=null)br.close();} catch (IOException e) {throw new RuntimeException("读关闭失败");}try {if(bw!=null)bw.close();} catch (IOException e) {throw new RuntimeException("写关闭失败");}}}}//readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。//readLine方法的原理//无论是读一行,获取多个字符。其最终都是在硬盘上一个一个读取。//所以最终使用的还是read方法,一次读一个的方法。//明白了BufferedReader类中特有方法readLine的原理后,//可以自定义一个类中包含一个功能和readLine一致的方法。//<strong>来模拟一下BufferedReader。</strong>

装饰设计模式:

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。

那么自定义的该类称为装饰类。

例子:

class Person{public void chifan(){System.out.println("吃饭");}}//增强吃饭功能class SuperPerson{private Person p;SuperPerson(Person p){this.p=p;}public void superChifan(){System.out.println("开胃酒");p.chifan();}}public class PersonDemo {public static void main(String[] args) {Person p = new Person();SuperPerson sp = new SuperPerson(p);sp.superChifan();}}

装饰类通常会通过构造方法接收被装饰的对象。

并基于被装饰的对象的功能,提供更强的功能。


装饰和继承的区别:


MyReader//专门用于读取数据的对象。

|——MyTextReader

|——MyBufferTextReader

|——MyMediaReader

|——MyBufferMediaReader

|——MyDataReader

|——MyBufferDataReader


利用装饰设计模式进行优化:

class MyBufferReader   extends  Myreader

{

private MyReader mr;

MyBufferReader(MyReader  mr)

{

this.mr = mr;

}

}

优化后的体系:

MyReader//专门用于读取数据的对象。

|——MyTextReader

|——MyMediaReader

|——MyDataReader

|——MyBufferDataReader


装饰模式比继承要灵活。避免了继承体系的臃肿。

而且降低了类与类之间的关系。


装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。

所以装饰类和被装饰类通常是都属于一个体系中。


练习:将myBufferedReader变成Reader的子类。


BufferReader的子类:

LineNumberReader     跟踪行号的缓冲字符输出流。  也是一个包装类。

其中含有两个方法:

setLineNumber和getLineNumber。设置行号和获取行号。


//练习:模拟一个带行号的缓冲区对象。


import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.Reader;class MyLineNumberReader extends BufferedReader{private int n ;public MyLineNumberReader(Reader in) {super(in);n=0;}public int getLine(){return n;}public void setLine(int n){this.n = n;}public String readLine() throws IOException{n++;return super.readLine();}}public class MyLineNumberReaderDemo {public static void main(String[] args) throws IOException {MyLineNumberReader mr = null;mr=new MyLineNumberReader(new FileReader(".\\src\\MyLineNumberReaderDemo.java"));String str = null;while((str = mr.readLine())!=null){System.out.print(mr.getLine()+str+System.lineSeparator());}mr.close();}}


-----------android培训java培训、java学习型技术博客、期待与您交流!------------


0 0
原创粉丝点击