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更难以解析
* 媒体文件都有自身的编码格式(千变万化) 文字有固定的编码格式
* 没有对应的 码表就会用未知字符区的数据来表示没有对应的情况 源数据和默认数据不一致
* 就不能再被解析 还可能变大
*/
- javaseday21补充(装饰设计模式 BufferedReader 的小弟 LineNumber 行号媒体文件的复制)
- 【装饰设计模式】写一个MyBufferedReader实现自己的ReadLine方法、增强BufferedReader的ReaderLine()
- J2SE中 装饰设计模式之用自定义类去实现BufferedReader类的功能
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- 从BufferedReader到装饰设计模式
- 使用字节流实现媒体文件的复制
- 装饰设计模式的演示
- 装饰设计模式的理解。
- 装饰设计模式的理解
- 字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- 设计模式--对装饰模式的思考
- 【有毒的设计模式】装饰模式
- 去除复制代码的行号
- 装饰模式设计-装饰类和继承类的区别
- 最近写东西需要复制代码的行号,用了gvim,总结些经验,复制行号,缩进,模式
- 装饰器模式的设计原理
- java装饰设计模式的由来
- ResNet论文翻译——中英文对照
- [cs231n]卷积神经网络的实现与理解(一)
- 解决“Win 10 ipv6无网络权限/无Internet连接权限”问题
- powerdesigner相关整理
- Maven+SpringMVC+Swagger整合
- javaseday21补充(装饰设计模式 BufferedReader 的小弟 LineNumber 行号媒体文件的复制)
- css实现内容超长自动截取并显示省略号
- ffmpeg.c源码阅读
- JAVA互联网学习之Filter
- hdu 5707 Combine String dphen dp
- 单元测试心得
- JS打开摄像头并截图上传示例
- MQ相关
- HDU 2602 Bone Collector (01背包)