您的位置:首页 > Web前端

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

2017-08-16 19:39 621 查看
/*

 * 装饰设计模式

 * 对一组对象的功能进行增强时 就可以使用该模式进行问题的解决

 * 装饰和继承都能实现一样的特点 进行功能的扩展增强

 * 有什么区别

 *

 * 首先有一个集成体系

 * 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更难以解析 

 * 媒体文件都有自身的编码格式(千变万化)  文字有固定的编码格式

 * 没有对应的 码表就会用未知字符区的数据来表示没有对应的情况 源数据和默认数据不一致

 * 就不能再被解析 还可能变大

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