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

JAVA高级应用之装饰者模式 LineNumberReader 打印流

2018-02-02 20:16 405 查看

装饰者模式

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

BufferedOutputStream
需要OutputStream参数进行构造
可以是FileOutputStream
相当于装饰后 功能得到提升 写入效率提高

ObjectOutputStream
需要OutputStream参数进行构造
可以是FileOutputStream
装饰后 功能提升了,可以写对象了

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

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


代码示例

package com.lanou3g.o03;

public class Demo06 {
public static void main(String[] args) {
MyStudent myStudent = new MyStudent(new Student1());
myStudent.code();
}
}
interface Coder{
public abstract void code();
}
class Student1 implements Coder{
@Override
public void code() {
// TODO Auto-generated method stub
System.out.println("会c语言");
System.out.println("会c++语言");
System.out.println("会c#语言");
}
}
class MyStudent implements Coder{
private Student1 student;
public MyStudent() {
}
public  MyStudent(Student1 student) {
this.student = student;
}
@Override
public void code() {
// TODO Auto-generated method stub
student.code();
System.out.println("会java");
System.out.println("会js");
System.out.println("会query");
}

}


LineNumberReader

构造方法
LineNumberReader(Reader in)
参数为reader类的子类 比如FileReader  BufferedReader

普通方法:
int  getLineNumber() 获得当前行号
String  readLine()  读取文本行
void  setLineNumber(int lineNumber)  设置当前行号


代码示例

package com.lanou3g.o03;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

import javax.annotation.processing.Filer;

public class Demo07 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/test3/ppp.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String string = "";
while((string = lnr.readLine()) != null) {
int number = lnr.getLineNumber();
System.out.println(number + string);
}
lnr.close();
}
}


底层实现LineNumberReader()

package com.lanou3g.o03;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo08 {
public static void main(String[] args) throws IOException {
FileReader fis = new FileReader("/Users/lanou/Desktop/test3/ppp.txt");
MyLineNumber myLineNumber = new MyLineNumber(fis);
String string = "";
myLineNumber.setNum(100);
while((string = myLineNumber.readLine1()) != null) {
System.out.println(myLineNumber.getNum()  + string);
}
myLineNumber.MyClose();
}
}
class MyLineNumber{
private Reader reader;
int num = 0;
public MyLineNumber() {

}
public MyLineNumber(Reader reader) {
this.reader = reader;
}

public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String readLine1() throws IOException {
StringBuilder sBuilder = new StringBuilder();
num++;
int len = 0;
while((len = reader.read()) != -1) {
if(len == 10) {
return sBuilder.toString();
}else {
sBuilder.append((char)len);
}
}
if(sBuilder.length() == 0) {
return null;
}
return sBuilder.toString();
}

public void MyClose() throws IOException {
reader.close();
}
}


打印流(只能输出)

PrintStream(字节输出流)
构造方法可接收的参数:
1.文件(File)
2.字节输出流(OutputStream)
3.文件路径
PrintWriter(字符)
1.只能作为数据的目的地
2.可以把数据原样输出
3.永远不会抛出IO异常
但是可以抛出其它异常 如空指针异常
4.打印流相当于给其它的流对象 装饰了一个原样输出的功能

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

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


代码示例1:

public static void fun1() throws FileNotFoundException {
// 创建文件
File file =
new File("/Users/lanou/Desktop/test/kkk.txt");
// 创建缓冲字节输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
// 创建一个打印字节流
PrintStream ps = new PrintStream(bos);
// 写数据
ps.println("网卡了");
ps.println(true);
ps.print(100);
ps.write(100);
ps.print('b');
// 关闭资源
ps.close();
}

}


代码示例2:

public static void fun2() throws FileNotFoundException {
// 打印字符流
File file =
new File("/Users/lanou/Desktop/test/kkk.txt");
PrintWriter pw = new PrintWriter(file);
pw.print("haha");
pw.println(200);
pw.println(false);
// 刷新
pw.flush();
pw.close();
}


代码示例3

package com.lanou3g.o03;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;

public class Demo09 {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
StringBuilder sBuilder = new StringBuilder();
while(true) {
if(sBuilder.toString().endsWith("quit")) {
break;
}
int len = 0;
if((len = in.read())!= 10 ) {
sBuilder.append((char)len);
}else {
System.out.println(sBuilder.toString());
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐