- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------
1. 第二十天回顾, try catch finally throw throws.编译和运行的区别。运行出问题改源码,编译异常,使用try..catch 子类父类的方法异常,记住特点。 Writer,Reader 子类FileWriter,FileReader,构造方法全部写String文件名,write read 记住写和读的字符数组,使用流对象如果是字符输出请你务必flush,不要忘了关闭资源close。掌握文件的赋值,读写字符数组来实现
2. 第二十一天学习内容:字符流缓冲区对象BufferedRead BufferedWriter,readLine,newLine.装饰设计模式,自己实现readLine功能。字节流,InputStream,OutputStream,实现任意文件的读写,字节流的缓冲区对象BufferedInputStream,BufferedOutputStream。转换流对象,字节转字符InputStreamReader字符转成字节OutputStreamWriter
3. 字符输出流缓冲区对象BufferedWriter类
缓冲区提高流的读写效率而出现
BufferedWriter,也是Writer的子类,Writer类的方法都可以用的,使用缓冲区对象,必须有一个流对象配合使用
BufferedWriter类的构造方法 BufferedWriter(Writer w)参数是一个字符输出流,我们现在的字符输出流,FileWriter ,将这个输出流FileWriter类的对象,传递给BufferedWriter的构造方法 BfferedWriter(new FileWriter),BufferedWriter这个缓冲区,将提高FileWriter的写如效率。
缓冲区特有方法 void newLine()文本中,写换行。可以写\r\n还是用newLine(),如果需要文本的换行,需要使用newLine()实现,这个方法具有跨平台性
Windows,换行\r\n Linux换行\n . 如果安装的JDK是Windows版本的,newLine()方法中写的就是\r\n, 安装的JDK是Linux版本,newLine()方法写的就是\n
4. 字符输入流的缓冲区对象BufferedReader类
缓冲区提高流的读取效率
BufferedReader也是Reader的子类,Reader的方法,都可以用
需要一个输入流对象,配合使用
BufferedReader构造方法,BufferedReader(Reader r)参数是一个字符输入流,现在的字符输入流FileReader ,将这个流对象,传递给BufferedReader构造方法,
BufferedReader(newFileReader)缓冲区就可以提高FileReader的读取效率,读取一行
String readLine()读取文本一行,返回字符串
5. 复制文本文件使用缓冲区
BufferedReader读一行,BufferedWriter写一行,写换行,刷新
需要4个 FileReader,FileWriter
文本复制三种形式,单个字符,字符数组,缓冲区的行读写
6. 装饰设计模式
出现意义,增强原有对象的功能
BufferedReader,BufferedWriter装饰类,装饰流
BufferedReader出现的目的,增强原有流对象Reader的功能
装饰设计在Java的IO中,使用的最广泛
根据刚才案例,对地面进行了装饰。
继承和覆盖,继承原有的地面类,重写承重方法,我们采用装饰模式也是可以实现的
继承覆盖和装饰区别在哪里
继承OOP思想的一个特征,设计模式都是基于OOP思想出现的
一组流对象,都是用来读取功能
继承来扩展程序:
Reader
文本类TextReader
extendsTextReader
音乐类SoundReader
extendsSoundReader
游戏类GameReader
extendsGameReader
电商类
电商子类
以上的类,功能不够,可以选择继承覆盖方法,单继承,每一个读取流,都会跟随一个子类出现.发现整个的继承体系,过于庞大,臃肿(冗余),学习者压力很大了,开发者使用的类就会更多
装饰模式,解决问题
Reader
文本类TextReader
音乐类SoundReader
游戏类GameReader
装饰类 BufferedReader(Reader r )
使用一个装饰类,把整个Reader体系全部装饰起来,需要一个类就够了
装饰设计,继承体系简单整洁,适合学,适合开发
继承和装饰的最大区别就是继承体系问题
7. BufferedReader读取行的原理
BufferedReader是一个装饰类,提高原有流对象的功能
BufferedReader(FileReader)
实现读取,还是依靠FileReader的read方法实现
读取单个字符的同时,判断是不是\r如果是,不理会直接在读
判断是不是\n 如果是行结束,返回字符串
如果读取到的字符,不是\r不是\n 将字符追加到缓冲区StingBuilder
8. 自定义装饰类,实现读取一行的功能
依照BufferedReader类的readLine方法原理,自己实现
读取到行,返回一个字符串,如果读取到文件的结尾,返回null
readLine方法返回值中,没有换符,写的方法,需要别人使用,传递给我一个字符输入流,装饰这个输入流
流的技术,读取单个字符read(),字符串的缓冲区。调用者需要循环调用自己的读取一行功能
9. OutpuStream字节输出流
字节输出流,写任意文件write 写字节数组,单个字节
是抽象类,不能直接用,找子类 FileOutputStream
构造方法,传递String的文件名。
字节流写数据的时候,不需要刷新,但是要关闭
10. InputStream字节输入流
字节输入流,读取任意文件read 读取字节数组,读单个字节
是抽象类,不能直接用,找子类 FileInputStream
构造方法,传递String的文件名 read方法读取文件结尾返回-1
read(字节数组)利用数组作为缓冲,提高流的读取效率
根据字符流的原理,字节流中的read()读取到的字节存储到字节数组中,返回读取一次的字节数中有效字节个数,文件末尾返回-1
字节输入流的方法 int available()返回字节输入流中封装的文件的字节数
11. BufferedOutputStream,BufferedInputStream字节流的缓冲区
和字符流缓冲区用法很像,字节流,没有行概念
BufferedOutputStream构造方法,传递字节输出流,写入的方法写单个字节,字节数组,没有行!!
BufferdInputStream 构造方法,传递字节输入流,读取的方法,单个字节,字节数组
字节流缓冲区复制文件。
12. 键盘输入
System.in 引用类型的成员变量 返回一个InputStream的子类对象
InputStream in =System.in;
返回一个字节输入流对象,调用流中的方法read()读取
使用BufferedReader中的readLine直接读取键盘一行,但是不行
System.in字节流, readLine字符流
13. 转换流--字节转成字符
InputStreamReader本身是一个字符流,继承Reader,字节流向字符的桥梁
InputStreamReader是字符,BufferedReader能不能缓冲这个转换流
BufferedReader(Reader r) 可以缓冲这个转换流,进行行读取
InputStreamReader构造方法中,传递字节输入流 ,参数写的是InputStream.
但是,毕竟转换流是字符流,处理文本数据
14. 控制台输出
System.out 引用类型的成员变量 返回一个PrintStream ,看到这个类的名字后缀是一个Stream,是字节流,继承OutputStream,肯定是一个字节输出流对象。
刚才我们的程序,读取的控制台输入,用的是字符流的readLine读取的键盘输入,将读取到的字符,输出到System.out中去,肯定不行,readLine读取到的是字符数据, System.out返回的是字节输出流
15. 转换流--字符转成字节流
OutputStreamWriter, 继承Writer,也是一个字符流
字符流向字节的桥梁
构造方法,传递字节输出流OutputStreamWriter(OutputStream out)构造器中,可以传递任意的字节输出流
16. 转换流好处
InputStream in =System.in
OutputStram out =System.out
转换流的好处,在于数据源和数据目的,可以随时发送变化
读取键盘输入,将输出到的内容,转成大写,保存文本中
数据源,键盘 ,目的 文件
读取一个Java文件,所有的内容,转成大写,输出控制台
数据源,文件 目的控制台
读取一个Java文件,所有的内容,转成大写,输出另一个文件
数据源,文件 目的是文件