- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
- IO流常用基类
- 字符流和字节流。
字节流两个基本类:
InputStream OutputStream
字符流两个基本类:
Reader Writer -
- 注:由这四个类派生出来的子类名字都是以其父类名作为子类名的后缀。
- 如:InputString的子类FileInputString
- Reader的子类FileReader
- 一,1,字符流的特点。
数据的最常见体现形式是:文件 -
- 2,IO流异常处理信息:
-
- 3,对已有文件的续写:
-
-
- 4,读出流。Reader:
-
-
-
- 流操作文件的原理图:
-
-
-
- 5,字符流的缓冲区:
- 缓冲区的出现是为了提高流的操作效率而出现的。
- 对应类:BufferedWriter BufferedReader
- 缓冲区要结合流才可以使用。
- 在流的基础上对流的功能进行了增强。
- 1, 在创建缓冲区之前,必须要要有流对象。
该缓冲区中提供了一个跨平台的换行符。newLine(); -
-
- 2,字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法 readLine
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。 -
-
-
- readeLine原理图:
-
-
-
- 6,带行号的缓冲区对象 setLineNumber() getLineNumber()
-
-
-
- 7,装饰和继承:
- MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyBufferTextReader
|--MyMeriaReader
|--MyBufferMeriaReader
|--MyDataReader
|--MyBufferDataReader
class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaReader media)
{}
}
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式。可以提高扩展性。
class MyBufferReader extends MyReader
{
private MyReader r;
MyBufferReader(MyReader r)
{}
}
优化体系变为:
MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyMeriaReader
|--MyDataReader
|--MyBufferReader
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能额已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常是属于一个体系中的。 -
-
- 二,字节流:InputStream(读取) OutputStream(写入)
- 1,FileInputStream
FileOutpurStream
缓冲区:
BufferedInputStream
BufferedOutputStream
通过键盘录入一行数据并打印大写,发现就是读一行数据的原理。也就是reanLine方法
readLine方法是字符流BufferedReader类中的方法。
而键盘录入的read方法是字节流InputStream的方法。
- InputStreamReader 是字节流通向字符流的桥梁。
- OutputStreamWriter 是字符流通向字节流的桥梁。
-
- System.out:对应的是标准输出设备:控制台。
System.in:对应的是标准输入设备:键盘。 - 2,流操作的基本规律:
通过三个明确来完成:
1,明确源和目的。
源:输入流 InputStream Reader
目的:输出流 OutputSteam Writer
2,操作的数据是否是纯文件。
是:字符流
不是:字节流
3,当体系明确后,在明确要使用哪个具体的对象。通过设备来区分:
源设备:内存,硬盘,键盘。
目的设备:内存,硬盘,控制台。
判断示例: 将一个文本文件中的数据存储到另一个文件中。就是复制文件。
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文件?
是:这时就可以选择Reader 这样体系就明确了
接下来明确要使用该体系中的那个对象。
明确设备:硬盘,上的一个文件。
Reader体系中可以操作文件的对象是FileReader
FileReader fr=new FileReader("a.txt");
是否需要提高效率?是:加入Reader体系中缓冲区 BufferedReader
BufferedReader bufr=new BufferedReader(fr);
目的:OutputStream Writer
是否是纯文本。
是:Writer
设备:硬盘,上的一个文件
Writer体系中可以操作文件的对象FileWriter
FileWriter fw=new FileWriter("b.txt");
是否需要提高效率?是:加入Writer体系中缓冲区 BufferedWriter
BufferedWriter bufw=new BufferedWriter(fw);
-
-
- 字节流操作示例:
-
-
-
-
- 3,/*,需求:将键盘录入的数据保存到一个文件中。
这个需求中有源和目的都存在。那么分别分析
源:InputSteram Reader
是不是纯文本?是:Reader
设备:键盘。对应的对象时System.in
不是选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in转换成Reader
用了Reader体系中转换流,InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率吗?需要:BufferedReader
BufferedReader bufr=new BufferedReader(isr);
目的:OutpurStream Writer
是否是纯文本?是:Writer
设备:硬盘。一个文件。使用FileWriter
FileWriter fw=new FileWriter("c.txt");
需要提高效率吗?需要:BufferedWriter
BufferedWriter bufw=new BufferedWriter(fw);*/
- 代码体现:
-
-