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更难以解析
* 媒体文件都有自身的编码格式(千变万化) 文字有固定的编码格式
* 没有对应的 码表就会用未知字符区的数据来表示没有对应的情况 源数据和默认数据不一致
* 就不能再被解析 还可能变大
*/
* 装饰设计模式
* 对一组对象的功能进行增强时 就可以使用该模式进行问题的解决
* 装饰和继承都能实现一样的特点 进行功能的扩展增强
* 有什么区别
*
* 首先有一个集成体系
* 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更难以解析
* 媒体文件都有自身的编码格式(千变万化) 文字有固定的编码格式
* 没有对应的 码表就会用未知字符区的数据来表示没有对应的情况 源数据和默认数据不一致
* 就不能再被解析 还可能变大
*/
相关文章推荐
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- 黑马程序员-JAVA学习之装饰设计模式与自定义BufferedReader
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- Java基础 - IO流之字符流,FileReader,FileWriter,BufferedReader,BufferedWriter,装饰设计模式,编码表
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- 黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- Java中IO流中的装饰设计模式(BufferReader的原理)
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
- IO流-2.【字符流缓冲区BufferedWriter/BufferedReader】【readLine()方法】【装饰设计模式】【LineNumberReader】
- J2SE中 装饰设计模式之用自定义类去实现BufferedReader类的功能
- 牛客网Java刷题知识点之字节缓冲区练习之从A处复制文本文件到B处(BufferedReader、BufferedWriter)、复制文本文件的原理图解
- IO流二:IO流之缓冲区BufferedReader、BufferedWriter、装饰设计模式、LineNumberReader
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
- 黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式
- 字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- java IO 字节流、字节流读写文件、字节流缓冲区、文件拷贝、装饰设计模式
- 【装饰设计模式】写一个MyBufferedReader实现自己的ReadLine方法、增强BufferedReader的ReaderLine()