您的位置:首页 > 编程语言 > Java开发

Java装饰者模式(设计模式)与缓冲字符输入流(LineNumberReader)和打印流

2018-02-02 19:19 585 查看

一、装饰者模式

1.定义:一种思想,通过装饰,对原来功能进行升级
2.装饰者模式流程
a.把被装饰者,写成成员变量
b.构造方法中,给该成员变量赋值
c.对原有功能进行升级
3.继承也可以实现功能的升级,那么装饰者模式好处
a.高内聚(类中方法之间的联系--联系最后紧密)
b.低耦合(解耦)(类和类之前,尽量不要产生联系)
例题1:使用LineNumberReader
public static void fun1() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/tes/znb.txt");
LineNumberReader lnr = new LineNumberReader(fr);
//设置行号
lnr.setLineNumber(101);
String string = "";
while((string = lnr.readLine()) !=null) {
System.out.println(lnr.getLineNumber()+":"+string);

}lnr.close();
}
例题2:利用装饰者,实现LineNumberReader
public static void fun2() throws FileNotFoundException, IOException {
//使用字节的类读取文件
FileReader fr = new FileReader("/Users/lanou/Desktop/tes/znb.txt");
wsLineNumberReader lnr  = new wsLineNumberReader(fr);
// 设置行号
lnr.setNum(100);
//循环读取
String string = "";
while((string = lnr.myRead())!=null) {
System.out.println(lnr.getNum()+":"+string);
}
lnr.myClose();
}


class wsLineNumberReader {
//将被修饰这写成成员变量
private  Reader  reader;
//记录行号
private int num = 0;
public wsLineNumberReader() {
// TODO Auto-generated constructor stub
}
public wsLineNumberReader(Reader reader) {
super();
this.reader = reader;
}

public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String myRead() throws IOException {
//方法走了几次,就是几行
num++;
//功能升级
StringBuilder stringBuilder = new StringBuilder();
//把读出的字节拼接成字符串
int len = 0;

while((len = reader.read())!=-1) {
//进行拼接
//遇到换行,这一行字符串,已经拼接完毕,返回就行
if (len =='\n') {
return stringBuilder.toString();

}else {
//不换行就拼接字符串
stringBuilder.append((char)len);
}
}
//如果stringBuilder等于0,
//读完了,没什么可拼接的
if(stringBuilder.length()==0) {
return null;
}
return stringBuilder.toString();
}
//关闭资源
public void myClose() throws IOException {
reader.close();
}

}


二、打印流(只能输出-原样输出)

1.PrintStream--字节打印流
构造方法可接受的参数:
a.文件
b.字节输出流(OutputStream)
c.文件路径
2.PrintWriter--字符打印流

3.特点
a.只能作为数据的目的地
b.可以把数据原样输出
c.永远不会抛出IO异常,但会抛出其他异常
d.相当于Print打印流类,可以给其他流类对象,装饰一个原样输出的功能
例题1:
public static void fun1() throws FileNotFoundException {
//创建文件
File file =new File("/Users/lanou/Desktop/tes/haha.txt");
//创建一个缓冲字节输出流
FileOutputStream fos = new FileOutputStream(file);

BufferedOutputStream bos = new BufferedOutputStream(fos);
//创建打印流
PrintStream ps = new PrintStream(bos);
//   调用写字符串的方法
ps.println("wanglong");
ps.println(true);
ps.println(100);
ps.println(3.5);
ps.println("p");
ps.write(100);
ps.close();
}
例题2:    打印字符流
public static void fun2() throws FileNotFoundException {

//创建文件
File file =new File("/Users/lanou/Desktop/tes/haha.txt");
//创建一个缓冲字节输出流
FileOutputStream fos = new FileOutputStream(file);

PrintWriter pw = new PrintWriter(fos);
pw.println("nihao");
pw.println(11);
pw.println(true);
pw.write(78);

pw.flush();
pw.close();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐