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); } } }
相关文章推荐
- Java装饰者模式(设计模式)与缓冲字符输入流(LineNumberReader)和打印流
- Java中的装饰者模式、LineNumberReader、打印流(基础解析)
- JAVA高级应用之装饰者模式 LineNumberReader 打印流
- 黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式
- Java学习日志(19-2-IO流-装饰设计模式与LineNumberReader)
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- Java基础知识强化之IO流笔记54:IO流练习之 LineNumberReader的特有的功能使用
- JavaWeb中使用Filter以及装饰者设计模式解决全局编码格式问题
- Java提升-单例模式、享元模式以及IntelliJ IDEA15的使用(七)
- java--IO流-LineNumberReader,读取键盘录入,字符字节流转换,改变标准输入输出设备,异常的日志信息,系统信息
- Java中static键字的思考以及使用static创建单例模式
- Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例
- JAVA——LineNumberReader
- 使用LineNumberReader方法来实现读取文件的方法
- Java基础---Java---IO流-----LineNumberReader方法及原理、自定义一个LineNumberReader、字节流、图片复制、mp3复制、
- IO流-2.【字符流缓冲区BufferedWriter/BufferedReader】【readLine()方法】【装饰设计模式】【LineNumberReader】
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法
- java中IO流的解释意义 以及装饰者模式的链接