装饰者模式
作用
1.解耦, 不让类和类产生继承的关系
2.对对象的原有的功能进行升级
书写步骤
1.明确被装饰的对象
2.将被装饰的对象通过构造方法传入装饰类, 装饰类中肯定有一个成员变量 就是被装饰的对象
3.拥有被装饰的对象, 相当于可以调用该对象中的所有方法, 就可以对该方法进行升级
使用例子
// 学习的接口
interface Study{
void study();
}
// 在校学生
class Student implements Study{
@Override
public void study() {
System.out.println("在校学习了C C++ C#");
}
}
// 装饰类
class YJStudent implements Study{
// 将被装饰者声明为成员变量
private Student student;
// 提供有参的构造方法
public YJStudent() {
super();
}
public YJStudent(Student student) {
super();
this.student = student;
}
// 对方法进行装饰(升级)
@Override
public void study() {
// 调用原有的学习方法
student.study();
// 装饰新功能
System.out.println("学习了Java");
}
}
打印流
特点
1.永远不会抛出IO异常
2.原样输出到目的端
- PrintStream
构造方法: 字符串路径, 文件对象, 字节流对象
使用方法
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/lala.txt");
PrintStream ps = new PrintStream(fos);
// 写文件
ps.println("dadada");
ps.println(false);
ps.println(321);
ps.close();
- PrintWriter
构造方法: 字符串路径, 文件对象, 字节流对象, 字符流对象
注意:只有操作流对象的时候, 才能自动刷新
使用方法
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/lala.txt");
PrintWriter pw = new PrintWriter(fos,true);
pw.println("大大大");
pw.println(123);
pw.println(true);
pw.close();
综合运用(利用转换流, 高效流, 打印流完成在控制台输入文字,写入文件中)
public static void main(String[] args) throws IOException {
System.out.println("请输入");
InputStream in = System.in;
// 使用转换流 将字节-->转字符
InputStreamReader isr = new InputStreamReader(in);
// 读一行 利用 BufferedReader 中的 readLine()方法
BufferedReader br = new BufferedReader(isr);
// 打印流原样输出 一次写一行到文件
File file = new File("/Users/lanou/Desktop/lala.txt");
FileWriter fw = new FileWriter(file);
PrintWriter pw = new PrintWriter(fw,true);
int num = 0;
// 读写
String string = "";
while ((string = br.readLine()) != null) {
num++;
// 结束条件
if (string.equals("quit")) {
break;
}
// 写入文件
pw.println(num + ":" + string);
}
// 关闭资源
br.close();
pw.close();
}
合并流
SequenceInputStream(字节流, 任何文件都能合并)
作用:可以将多个文件合并成一个新的文件
方法一,只能合并两个文件,方法如下
// 合并两个文件
File f1 = new File("/Users/lanou/Desktop/111.txt");
File f2 = new File("/Users/lanou/Desktop/222.txt");
FileInputStream fis1 = new FileInputStream(f1);
FileInputStream fis2 = new FileInputStream(f2);
// 创建合并流
SequenceInputStream sis = new SequenceInputStream(fis1, fis2);
// 写入到新的文件中 打印流写
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/333.txt");
// 读写
int len = 0;
while ((len = sis.read()) != -1) {
fos.write(len);
}
// 关流
sis.close();
fos.close();
方法二,可以合并多个文件,使用如下
File f1 = new File("/Users/lanou/Desktop/111.txt");
File f2 = new File("/Users/lanou/Desktop/222.txt");
File f3 = new File("/Users/lanou/Desktop/333.txt");
// 创建字节流 并且将三个流添加到 集合中
Vector<FileInputStream> vector = new Vector<>();
vector.add(new FileInputStream(f1));
vector.add(new FileInputStream(f2));
vector.add(new FileInputStream(f3));
// 获取迭代器
Enumeration<FileInputStream> elements = vector.elements();
// 合并文件
SequenceInputStream sis = new SequenceInputStream(elements);
// 使用打印流写入
InputStreamReader isr = new InputStreamReader(sis);
BufferedReader br = new BufferedReader(isr);
// 写
FileWriter fw = new FileWriter("/Users/lanou/Desktop/444.txt");
PrintWriter pw = new PrintWriter(fw,true);
String string = null;
while ((string = br.readLine()) != null) {
// 写
pw.println(string);
}
br.close();
pw.close();