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

Java之打印流、装饰者模式以及LineNumberReader的使用

2018-02-02 20:13 411 查看

装饰者模式(设计模式)

思想:可以通过装饰对原来的功能进行升级

例如:BufferedOutputstream
需要Outputstream构造
可以使FileOutputStream(被装饰者)功能得到提升 相当于装饰后,写入效率提高了

ObjectOutputstream
需要Outputstream构造
可以使FileOutputStream被装饰后功能提升,即可以写对象

装饰者模式流程
1.把被装饰者写成成员变量
2.构造方法中给该成员变量赋值
3.对原有功能的升级

装饰者模式的好处
高内聚:类中方法之间的联系 联系最好紧密
低耦合(解耦):类与类之间尽量不要产生联系

代码示例:
public class Demo01 {
public static void main(String[] args) {
LOStudent student = new LOStudent(new Student());
student.code();
LXStudent student2 = new LXStudent(new Student());
student2.code();
}
}

// 学习写代码
interface Coder{
public abstract void code();
}
// 学生实现这个接口
// 学生是被装饰者
class Student implements Coder{

@Override
public void code() {
System.out.println("c");
System.out.println("c++");
System.out.println("c#");
}
}

// 进行包装
class LOStudent implements Coder{
private Student student;
// 构造方法中传入被装饰者
// 构造方法都是初始化成员变量的
// 所以被装饰者应该是本类的成员变量
public LOStudent() {}

public LOStudent(Student student) {
super();
this.student = student;
}

// 进行学习代码
@Override
public void code() {

// 调用被装饰者的原有功能
student.code();
// 对功能的升级
System.out.println("java");
System.out.println("html");
System.out.println("js");
}
}

// 进行包装
class LXStudent implements Coder{
private Student student;

public LXStudent() {    }

public LXStudent(Student student) {
super();
this.student = student;
}

@Override
public void code() {
student.code();
System.out.println("电竞");
System.out.println("汽修");
System.out.println("挖掘机");
}
}


LineNumberReader

特点:能获取行号

代码示例:
FileReader fr = new FileReader("/Users/lanou/Desktop/test/ppp.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String len = "";
while ((len = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + len);
}
lnr.close();


利用装饰者实现LineNumberReader

class MyLineNumberReader {
private Reader reader;

// 记录行号
private int num = 0;

public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public MyLineNumberReader() {
}
public MyLineNumberReader(Reader reader) {
super();
this.reader = reader;
}
// 功能升级 从读字节 升级到读行
public String myRead() throws IOException {
// 方法走一次 就代表读了一行
num++;
StringBuilder stringBuilder = new StringBuilder();
int len = 0;
while ((len = reader.read()) != -1) {
if (len == 10) {
// 遇到换行
return stringBuilder.toString();

} else {
stringBuilder.append((char)len);
}
}
if (stringBuilder.length() == 0) {
return null;
}
return stringBuilder.toString();
}
// 关闭资源
public void myClose() throws IOException {
reader.close();
}
}

public static void main(String[] args) throws IOException {
// 使用字节的类 读取文件
FileReader fr = new FileReader("/Users/lanou/Desktop/test/ppp.txt");
MyLineNumberReader mnr = new MyLineNumberReader(fr);
// 设置行数
mnr.setNum(100);
String len = "";
while ((len = mnr.myRead())!=null) {
System.out.println(mnr.getNum() + len);
}
mnr.myClose();
}


打印流

PrintStream(字节)
构造方法可接受的参数:
1.文件(File)
2.字节输出流(OutputStream)
3.文件路径

PrintWriter(字符)
1.只能作为数据的目的地
2.可以把数据原样输出
3.永远不会抛出IO异常 但是可以抛出其他异常 例如空指针
4.打印流相当于可以给其他的流对象装饰一个原样输出的功能

System.in 是BufferedInputStream 缓冲输入字节流
作用:接受键盘输入的内容

System.out 是PrintStream 打印输出字节流
作用:输出内容到控制台


public static void main(String[] args) throws IOException {
// 创建文件 打印字节流 "/Users/lanou/Desktop/test/ppp.txt"
File file = new File("/Users/lanou/Desktop/test/ppp.txt");
// 缓冲字节输出流
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(bos);
// 写数据
ps.println("hahaha");
ps.println(true);
ps.print(100);
ps.print(3.5);
ps.write(100);
ps.println('p');
// 关闭资源
ps.close();
}


public static void main(String[] args) throws IOException {
// 打印字符流
File file = new File("/Users/lanou/Desktop/test/ppp.txt");
PrintWriter pw = new PrintWriter(file);
pw.println("hah");
pw.println(100);
pw.print(true);
pw.flush();
pw.close();
}


public static void main(String[] args) throws IOException {

System.out.println("请输入");
// 读取从键盘输入的数据
InputStream in = System.in;
// 拼接字符串
StringBuilder stringBuilder = new StringBuilder();
while (true) {
if (stringBuilder.toString().endsWith("quit")) {
break;
}
// 读取数据  拼接数据
int len = in.read();
if (len == 10) {
System.out.println(stringBuilder.toString());
stringBuilder.delete(0, stringBuilder.length());
} else {
stringBuilder.append((char)len);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐