javaday45_IO流5_装饰者模式、lineNember、字节流

来源:互联网 发布:捕鱼达人 h5源码 编辑:程序博客网 时间:2024/05/29 16:57

1.内容:

/**
 * 定义:装饰着设计模式:
 * 当堆一组对象的功能进行增强时,就可以使用该模式进行问题的解决,实质上是基于原来对象的,只是一种增强
 * 
 * 
 * 装饰和继承都能实现一样的特点:
 *         进行功能的拓展增强
 *         
 * 有什么区别呢?
 *    
 * Writer
 *      |--TxtWriter  :用于操作文本
 *      |--MediaWriter:用于操作媒体
 * 
 * 想要对操作的动作做进行效率的提高
 * 按照面向对象的思想,可以通过继承对具体的进行功能的拓展
 * 效率提高需要缓冲技术
 *  
 *   Writer
 *      |--TxtWriter  :用于操作文本
 *            |--BufferedTxtWriter: 加入了缓冲技术的操作文本的对象
 *      |--MediaWriter:用于操作媒体
 *            |--BufferedTxtWriter: 加入了缓冲技术的操作文本的对象
 *            
 *到这里就哦了,但是这样做好像并不理想
 * 如果这个体系进行功能拓展,又多了流对象,那么这个流要提高效率,是不是也要产生子类呢?是
 * 这时就会发现,只为提高功能进行的继承,导致继承体系越来越臃肿,不够灵活           继承他就得产生关系
 * 
 * 重新思考:
 *  既然加入的都是同一种技术--缓冲
 *  前一种是让缓冲和具体的流对象相结合
 *  可不可以将缓冲进行单独的封装,那个对象需要缓冲就将那个对象和缓冲关联
 *  
 *  class buffer{
 *  Buffer(TextWriter w){
 *  }
 *  Buffer(Mediawriter m){
 *  }
 *  }
 *  
 *  父类更靠谱
 *  class BufferWriter externds Writer{
 *  Buffer(writer w){
 *  }
 *  }
 *  
 *  * Writer
 *      |--TxtWriter  :用于操作文本
 *      |--MediaWriter:用于操作媒体
 *      |--BufferWriter:提高效率的写
 * 
 * 发现:装饰要比继承灵活
 * 特点:装饰类和被装饰类都必须所属同一个接口或者父类
 * */


2.装饰设计模式,PersonDemo

package java_Studing_day45_IO流5_装饰设计模式;


public class persondemo {


    public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Person();
//p.eat();
NewPerson np=new NewPerson(p);
np.eat();
np.runcar();
System.out.println("**********************************************");
NewPerson2 np2=new NewPerson2();
np2.eat();


    }


}
class Person{
    
    public void eat(){

System.out.println("吃饭");
    }
 }


//这个类的出现是为了增强Person这个类而出现的                        装饰设计模式
class NewPerson{
    private Person p;
    NewPerson(Person p){ //构造函数传入Person对象进行增强

this.p=p;
}
    
    
    public void eat(){
System.out.println("开胃酒");
p.eat();
System.out.println("甜点");

    }
    public void runcar(){
System.out.println("开跑车");
    }
    
    
}
//继承设计模式
class NewPerson2 extends Person{
     public void eat(){
System.out.println("开胃酒");
super.eat();
System.out.println("甜点");

    }
    
    
}




3.lineNemberReader的使用

package java_Studing_day45_IO流5_装饰设计模式;


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


public class lineNumberReader {


    private static final String Line_Menber = System.getProperty("line.separator");//获取系统换行符


    public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub


FileWriter fw=new FileWriter("lineNumberReader.txt");
fw.write("sdfsadfeaLine_Men\nbersdgfsdLine_Men\nberrersdfgesdLine_M\nenbernbergrsdfLinen_Menbe\nrerdgsrgLinenMenbe\nrnbersrgsdgLine_Men\nberenbergsewgsdfgs");
fw.flush();

FileReader fr=new FileReader("lineNumberReader.txt");
LineNumberReader lnr=new LineNumberReader(fr);//获取行号的缓冲

String line=null;
lnr.setLineNumber(100);//设置行号开始编号
while((line=lnr.readLine())!=null){
   System.out.println(lnr.getLineNumber()+":"+line);//打印行号和缓存内容
 
}
lnr.close();
    }
    
    


}



4.字节流Demo和常用的缓存方式选择

package java_Studing_day45_IO流5_字节流;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class ByteStreamDemo {


    public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
demo_write();
read();


    }
    
    

//读

public static void read() throws IOException{
//创建一个读取流对象,和指定文件关联
FileInputStream fis=new FileInputStream("Bytedemo1.txt");



//第4种,获取刚好大小的数组做容器
System.out.println(fis.available());

byte[] buf=new byte[fis.available()];
fis.read(buf);
System.out.println(new String(buf));



//第3种方式,自定义Byte数组容器当做缓存容器读取
// byte[] buf=new byte[1024];
// int len=0;
// while((len=fis.read(buf))!=-1){
//    System.out.println(new String(buf,0,len));
// }



//第2种方式,系统缓存读
// int ch=0;
// while((ch=fis.read())!=-1){
//    System.out.println((char)ch);
// }



//第1种方式,一次读取一个字节
//int ch=fis.read();
//System.out.println(ch);



fis.close();

    }


 

//写

   public static void demo_write() throws IOException {


//1.创建字节输出流对象,用于操作文件
FileOutputStream fos=new FileOutputStream("Bytedemo1.txt");
//2.写数据,直接写入到了目的地中
fos.write("abcdefg".getBytes());

//fos.flush();//现在没什么用,只有在缓冲区有用
fos.close();//关闭资源的动作还是要用的
    }


}


0 0
原创粉丝点击