javaseday21补充(装饰设计模式 BufferedReader 的小弟 LineNumber 行号媒体文件的复制)

来源:互联网 发布:手机淘宝链接怎么弄 编辑:程序博客网 时间:2024/06/07 13:16
/*
 * 装饰设计模式
 * 对一组对象的功能进行增强时 就可以使用该模式进行问题的解决
 * 装饰和继承都能实现一样的特点 进行功能的扩展增强
 * 有什么区别
 *
 * 首先有一个集成体系
 * Writer
 * TxtWriter 用于操作文本
 * MediaWriter 用于操作媒体
 * 想要对操作的动作进行效率的提高
 * 按照面向对象 可以通过继承 对具体对象进行功能的扩展
 * 面向对象三特征 继承 封装 多态
 * Writer
 * TxtWriter 用于操作文本
 * BufferTextWriter 加入了缓冲技术的操作文本的流对象
 * MediaWriter 用于操作媒体
 * BufferMediaWriter
 *
 * 到这里就行 但是这样做好像并不理想
 * 如果这个体系进行功能扩展 又多了流对象
 * 那么这个流要提升效率是不是也要产生子类 ? 是 这时就会发现只为提高功能 进行的继承
 * 导致继承体系越来越臃肿(很形象)。就不够灵活 还产生关系 脱离很难
 * 
 * 重新思考问题 ?
 * 既然加入的都是同一种技术 ——缓冲
 * 前一种是让缓冲和具体的对象相结合
 * 可不可以将缓冲进行单独的封装 哪个对象需要缓冲就 将哪个对象和缓冲关联
 * 
 * class Buffer{
 * Buffer(TextWriter w){}
 *  Buffer(MediaWriter m){}
 * }
 * class BufferWriter extends Writer{
 * Buffer(Writer w){} //对一组对象起作用 多态的一种应用
 * }
 * Writer
 * TxtWriter 用于操作文本
 * MediaWriter 用于操作媒体
 *  BufferWriter 用于提供效率
 * 装饰比继承更为灵活
 * 特点:装饰类和被装饰类都必须所属于同一个接口或者父类
 * 
 */
public class PersonDemo01 {
public static void main(String[] args) {
Person p = new Person();
p.chiFan();


NewPerson p1  = new NewPerson(p);
p1.chiFan();//跟装修差不多 本质一样 但是装饰后有更多的功能 相当于外观改变实质没变
NewPerson2 p2 = new NewPerson2();
p2.chiFan();
}
}


class Person{
void chiFan(){
System.out.println("吃饭");
}
}
//这个类的出现是为了增强Person而出现
class NewPerson{
private Person p ;
NewPerson(Person p){
this.p=p;
}
public void chiFan(){
System.out.println("开胃酒");
p.chiFan();
System.out.println("甜点");
}
}
class NewPerson2 extends Person{
@Override
public void chiFan(){
System.out.println("开胃酒");
super.chiFan();
System.out.println("甜点");
}

}


public class WrapperDemo01 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("demo.txt");
LineNumberReader lnr = new LineNumberReader(fr);


String line = null;
lnr.setLineNumber(100);//设行号 
while((line = lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+""+line);//通过lnr获取自身的行号
}
lnr.close();
}
}

public class MyBufferedReader extends Reader{ //完全装饰设计
// private FileReader r;//要对一组类进行增强 这样具有局限性
private Reader r;

/*
 * 字节流
 * 基本操作与字符流类相同
 * 其他不仅可以操作字符 还可以操作其他媒体文件
 *
 */
public class CharacterDemo01 {
public static void main(String[] args) throws IOException {
demo_write();
demo_read();
}


private static void demo_read() throws IOException {
// 1、创建一个读取流对象 和指定文件关联
FileInputStream fis = new FileInputStream("demo.txt");


// System.out.println(fis.available());//共有几个字节
byte[] buf = new byte[fis.available()];// 刚刚好大小 要慎用 因为如果关联个2g的电影狗带
fis.read(buf);// 内存可能溢出
System.out.println(new String(buf));// 但是有时可以进行分段存储
// 建议使用这种读取方式
// byte[] buf = new byte[1024];
// int len = 0;
// while((len=fis.read(buf))!=-1){
// System.out.println(new String(buf,0,len));
// }


// int ch = 0;
// while((ch=fis.read())!=-1){
// System.out.println(ch);
// }
// 一次读取一个字节
// int ch = fis.read();
// System.out.println(ch);
fis.close();
}


private static void demo_write() throws IOException {
// 1、创建字节输出流对象 用于操作文件
FileOutputStream fos = new FileOutputStream("demo02.txt");


// 2、写数据 直接写到目的地
fos.write("fdsfs".getBytes());


fos.flush();// 有些子类自己去做 flush 父类内部没东西 为了给子类提供方法


fos.close();// 关闭资源动作要完成


}


}


private static void copy_4() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");

int len = 0;
while((len=fis.read())!=-1){
fos.write(len);//千万别用 效率极低 基本没有
}
fos.close();
fis.close();
}


private static void copy_3() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");


byte[] buf = new byte[fis.available()];//不建议使用 太大就要创建半天还可以溢出内存
fis.read(buf);
fos.write(buf);
fos.close();
fis.close();
}


private static void copy_2() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);


// byte[] buf = new byte[1024];
// int len =0;
// while((len=fis.read(buf))!=-1){
// bos.write(buf,0,len);
// bos.flush();
// }
int ch =0;
while((ch=fis.read())!=-1){//因为封装了缓存区 所以可以不用再加个字节数组
bos.write(ch);
bos.flush();
}
bos.close();
bis.close();
}


private static void copy_1() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");


byte[] buf = new byte[1024];//自定义缓存区 在大型的时候效率不一定
int len =0;
while((len=fis.read(buf))!=-1){//如果不写buf 就一直写那个0角标 直到硬盘塞满
fos.write(buf,0,len);
}
fos.close();
fis.close();
}


/*
 * 字符流有可能传递图片概率很低 因为要查码表 很大概率找不到对应的就用未知的替代 
 * 然后图片编辑器无法解析这些异常的编码 不能看
 * 操作Media更难以解析 
 * 媒体文件都有自身的编码格式(千变万化)  文字有固定的编码格式
 * 没有对应的 码表就会用未知字符区的数据来表示没有对应的情况 源数据和默认数据不一致
 * 就不能再被解析 还可能变大
 */



阅读全文
0 0