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

Java中的装饰者模式、LineNumberReader、打印流(基础解析)

2018-02-02 20:33 423 查看

装饰者模式(设计模式)

思想: 可以通过装饰 对原来的功能进行升级
BufferedOutputstream
需要 Outputstream 构造
可以使 FileOutputStream(被装饰者)
相当于装饰后 功能得到了提升 写入效率提高了

ObjectOutputstream
需要 Outputstream 构造
可以使用 FileOutputStream

通过ObjectOutputstream 装饰后
功能提升 可以写对象了

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


LineNumberReader(读行)

public static void fun1() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/Test/hh.txt");
LineNumberReader lnr = new LineNumberReader(fr);
//设置开始的行号
lnr.setLineNumber(10);
String string = "";
while ((string = lnr.readLine()) != null) {

System.out.println(string + ": " +  lnr.getLineNumber());
}
lnr.close();
}
}


利用装饰者模式 实现 LineNumberReader
被装饰者 Reader
1.把read()方法升级 读行
2.带行号
3.关闭资源功能升级

class UpToLineNumberReader{
private Reader r;
// 记录行号
private int num = 0;
// 有参无参构造方法
public UpToLineNumberReader(){

}
public UpToLineNumberReader(){

}
// set/get方法
public int getNum() {
return num;
}

public void setNum(int num) {
this.num = num;
}
// 功能升级 从读字节 升级到 读行
public String upToRead() throws IOException {
// 方法走一次 就代表读了一行
num++;
// 拼接字符串
StringBuilder stringBuilder = new StringBuilder();
int len = 0;
while ((len = r.read()) != -1){
// 进行拼接
// 遇到换行 这一行字符串已经拼接完毕 直接返回就行
// ASCII中 10 就代表换行 相当于"\n"
if(len == 10){
return stringBuileder.toString();
}else{
// 不换行 就拼接字符串
string.Builder.append((char)len);
}
}
// 读完了 没有内容可以继续拼接了
if (stringBuilder.length() == 0) {
return null;
}
return stringBuilder.toString();
}
// 关闭资源
public void closeUpToRead() throws IoException {
r.close();
}
}


打印流

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


打印字节流

public static void fun1() throws FileNotFoundException {
// 创建文件
File file = new File("/Users/lanou/Desktop/Test/hh1.txt");

FileOutputStream fos = new FileoutputStream(file);
//创建缓冲字节输出流
BufferedOutputstream bos = new BufferedOutputstream(fos);
//创建一个打印字节流
PrintStream ps = new PrintStream(bos);
//写数据
ps.println("aa");
ps.println(true);
ps.println(100);
ps.println(3.5);
ps.write(100);
ps.println('p');
// 关闭资源
ps.close();
}


打印字符流

// 打印字符流
public static void fun2() throws FileNotFoundException {
// 打印字符流
// 创建文件
File file = new File("/Users/lanou/Desktop/Test/hh1.txt");
//创建打印字符流
PrintWriter pw = new PrintWriter(file);
pw.println("aa");
pw.println(200);
pw.println(false);
pw.write('c');
// 刷新
pw.flush();
// 关闭资源
pw.close();
}


System.in 是 BufferedInputStream 缓冲输入字节流

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


public class Demo03 {
public static void main(String[] args) throws IOException {
System.out.println("请输入");
// 读取从键盘输入的数据
Inputstream in = System.in;
StringBuilder stringBuilder = new StringBuilder();
int len = 0;
while(true){
if(stringBulider.toString().equals("quit")){
break;
}
// 读取数据 拼接数据
len = in.read();
if (len == 10) {
System.out.println(stringBuilder.toString());
// 清空缓冲字符串
stringBulider.delete(0, stringBulider.length());
}else {
stringBulider.append((char)len);
}
}
}
}

Day.27


http://blog.csdn.net/ssssssue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐