您的位置:首页 > 职场人生

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

2015-04-06 19:44 295 查看
-----------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学习型技术博客、期待与您交流!------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: