一.装饰者模式
思想:将原有的功能进行提升
装饰者步骤:
1.将被装饰者当做类中的成员变量
2.在构造方法中进行成员变量赋值
(赋值后 就相当于可以拿到装饰者这个对象)有这个对象 就能调用该对象的方法
3.对方法进行升级
//学习代码的接口
interface study{
//学习代码
public abstract void studyCode();
}
class Student implements study{
@Override
public void studyCode() {
System.out.println("学习c");
System.out.println("学习c++");
System.out.println("学习c#");
}
}
//蓝鸥学生
class LOStudent implements study{
//将学生作为成员变量
private Student student;
//构造方法
public LOStudent() {
super();
// TODO Auto-generated constructor stub
}
public LOStudent(Student student) {
super();
this.student = student;
}
//学生方法升级
// public void loCode() {
//
// }
@Override
public void studyCode() {
// 调用被装饰者的功能
student.studyCode();
//升级
System.out.println("蓝鸥学java");
System.out.println("蓝鸥学h5");
}
}
二 .LineNumberReader
File file =new File("/Users/lanou/Desktop/aa/ll.txt");
FileReader fr=new FileReader(file);
LineNumberReader inr=new LineNumberReader(fr);
//设置行号
inr.setLineNumber(100);
//读文件
String string="";
while ((string=inr.readLine())!=null) {
//打印行号和内容
System.out.println(inr.getLineNumber()+":"+string);
}
inr.close();
模拟lineNumberReader类
利用装饰者模式 获取设置行号功能
class MyLineNumberReader{
//声明成员变量(被包装的对象)
//成员变量 可以是抽象类 也可以是接口
private Reader reader;
private int num;
//构造方法
public MyLineNumberReader() {
super();
// TODO Auto-generated constructor stub
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public MyLineNumberReader(Reader reader) {
super();
this.reader = reader;
}
//对功能升级(从读取的方法中 获取行号)
//计算行号 read()获取的是一个字符
//readline 返回的一行 需要拼接成一行
//读完了 返回null
public String myReadLLine() throws IOException {
//行号++
num++;
//没地哦啊一次本方法,返回一行字符串
//拼接字符串
StringBuilder sb=new StringBuilder();
//读取文件
int len=0;
while ((len=reader.read())!=-1) {
if (len!='\n') {
//拼接
sb.append((char)len);
}else {
//返回字符串
return sb.toString();
}
}
//循环外判断文件读完 返回空
if (sb.length()==0) {
return null;
}
//保证方法会有返回值
return sb.toString();
}
//关闭流方法
public void myClose() throws IOException {
reader.close();
}
三.打印流(永远不会抛出io异常)
操作输出目的 (写文件 控制台打印)
PrintStream(字节流)
构造方法:文件 字节输出流 路径
PrintWriter(字符流)
构造方法:文件 字节输出流 路径 字符输出流
核心功能:原样输出到目的端
system.in 是bufferedinputstream对象
sysout.out 是printstream对象(打印流)
File file =new File("/Users/lanou/Desktop/aa/ll.txt");
FileOutputStream fos=new FileOutputStream(file);
PrintStream ps=new PrintStream(fos);
ps.println("hahah");
ps.println(100);
ps.print(true);
//关闭
ps.close();
File file =new File("/Users/lanou/Desktop/aa/ll.txt");
FileWriter fw=new FileWriter(file);
//开启自动刷新的构造方法是对流有效
PrintWriter pw=new PrintWriter(fw,true);
pw.println("dahaiba");
pw.println(true);
//关闭前会刷新
pw.close();
四.合并流
//将三个文件写到第四个文件中
File file1=new File("/Users/lanou/Desktop/aa/1.txt");
File file2=new File("/Users/lanou/Desktop/aa/2.txt");
File file3=new File("/Users/lanou/Desktop/aa/3.txt");
//创建集合
Vector<FileInputStream>vector=new Vector<>();
//向集合中添加要合并的文件
vector.add(new FileInputStream(file1));
vector.add(new FileInputStream(file2));
vector.add(new FileInputStream(file3));
//获取迭代器
Enumeration<FileInputStream> elements = vector.elements();
//创建合并流
SequenceInputStream sis=new SequenceInputStream(elements);
//写入第四个文件
FileOutputStream fos=new FileOutputStream("/Users/lanou/Desktop/aa/4.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos);
BufferedWriter bw=new BufferedWriter(osw);
//读写
int len=0;
while ((len=sis.read())!=-1) {
bw.write(len);
bw.newLine();
bw.flush();
}
sis.close();
fos.close();
Vector<FileInputStream>vector=new Vector<>();
for (int i = 1; i < 12; i++) {
File file =new File("/Users/lanou/Desktop/ss/kaoshi/"+i+".suipian");
FileInputStream fis=new FileInputStream(file);
vector.add(fis);
}
Enumeration<FileInputStream> elements = vector.elements();
FileOutputStream fos=new FileOutputStream("/Users/lanou/Desktop/ss/kaoshi/ks.txt");
SequenceInputStream sis=new SequenceInputStream(elements);
int len=0;
byte[]b=new byte[100];
while ((len=sis.read(b))!=-1) {
fos.write(b,0,len);
}
fos.close();
sis.close();