-----------------------------------------------------------------android培训、java培训、期待与您交流! ---------------------------------------------------------------
IO流
IO流用来处理设备之间的数据传输,Java对数据的操作是通过流方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流和字符流
流按流向分为:输入流,输出流
IO流常用基类
字节流的抽象基类
InputStream,OutputStream
字符流的抽象基类
Reader,Writer
注:由这四个类派生出来的子类名称都是以其父类类名作为子类类名的后缀。
一、字符流
Writer
方法:
write() :写字符数据
flush() :刷新流对象中的缓冲的数据,将数据刷到目的地中
如果只write()操作并没有flush(),那么数据还在内存中,目的地是没有数据的。
close() :关闭流资源,但是关闭之前会刷新一次内部的缓冲数据。
flush与close的区别:flush刷新后,流可以继续使用,close刷新后,流会被关闭。
append() :对已有文件数据续写--------对应构造函数FileWriter(Filefile, boolean append)
FileWriter(Stringfilename, boolean append)
在IO流中很多方法都会抛出IO异常,那么IO异常该如何处理?
标准处理程序:
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("file.txt");
fw.write("ddddd");
}catch(IOException e) {
System.out.println(e.toString());
}finally {
try {
if(fw != null)
fw.close();
}catch(IOException e) {
System.out.println(e.toString());
}
}
}
Reader
方法:
read() :一次读一个字符,并且自动往下读,如果到末尾,返回-1
read(char[] charf) :返回读取字符个数
read(char[] cbuf, int off, int len) :读取指定一段字符
close() :关闭流
文件读写流
FileWriter
FileReader
该两个流并没有扩充方法,与父类Writer和Reader相同
缓冲区技术 :为了提高流操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象
BufferedWriter
方法:
write(int c)
write(char[] cbuf,int off, int len)
write(String s,int off, int len)
flush()
close()
newLine():该缓冲区中提供了一个跨平台的换行符,可以实现换行
close :其实关闭缓冲区就是在关闭缓冲区中的流对象,所以关闭缓冲区就不必关流了
BufferedReader
方法:
read()
read(char[] cbuf,int off, int len)
readLine():缓冲区提供了一个新的方法,一次可以读取一行文本,当返回null时,表示读到文件末尾
readLine读取并不包括换行符
装饰设计模式
想对已有对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
装饰和继承的区别:
装饰模式比继承灵活,避免了继承体系臃肿,而且降低了类与类之间的关系
所以如果新的类只是扩展了原有类的几个方法的话,为了避免体系臃肿可以优先考虑装饰类。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能
所以装饰类与被装饰类通常都属于一个体系
BufferedReader的子类:
LineNumberReader
给类提供两个增强方法:设置和获取行号
setLineNumber(int lineNumber)
字节流
InputStream
OutputStream
所提供的方法与Reader和Writer的方法类似,传入的是字符或者是字符数组
字节流缓冲区
BufferedInputStream
BufferedOutputStream
字节流缓冲区的使用类似于字符流缓冲区的使用
读取键盘录入
System.in :对应的是标准输出设备。in是一个InputStream类型
System.out :对应的是标准输出设备,控制台。out是一个OutputStream类型
转换流
InputStramReader 字节通向字符的桥梁----读取键盘输入转换字符流
OutputStreamWriter 字符通向字节的桥梁---将字符流转成字节流输出
如何分析要使用哪个流操作
1. 明确源和目的
源:输入流
目的:输出流
2. 操作的数据是否是纯文本
是:字符流
不是:字节流
3. 当体系明确后,再明确要使用哪个具体的对象
通过设备进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
例如:将一个文本中数据存储到另一个文件组。复制文件
分析:
① 源:因为是源,所以使用读取流。InputStream 和Reader
② 操作的数据是否是纯文本:是,所以选用字符流 Reader
因此体系明确
③ 明确对象
明确设备:硬盘
Reader体系中可以操作文件的对象是----FileReader
目的:OutputStream 和Writer
是否是纯文本:是,所以选Writer
设备:硬盘,文件---
Writer体系中可以操作文件的对象---FileWriter
最后考虑是否需要提高效率
是:加入Reader体系中的缓冲区---BufferedReader
加入Writer体系中的缓冲区---BufferredWriter
例题2:将一个图片文件中数据存储到另一个文件中。
写好3个明确
1 需求:将键盘录入的数据保存到一个文件中
分析:
源:InputStream和 Reader
是不是纯文本?是,所以用Reader
设备:键盘-----对应的对象是System.in
体系是Reader但是System.in对应的是字节流
为了操作键盘的文本数据方便-----所以转成字符流---通过字符串操作
-----So 明确了Reader体系后,将System.in转成Reader
------所以 用Reader体系中的转换流,InputStreamReader
InputStreamReaderisr = new InputStreamReader(System.in);
考虑需要提高效率吗?需要------使用缓冲区BufferedReader
BufferedReaderbufr = new BufferedReader(isr);
目的:OutputStream和Writer
是否是纯文本?是 选Writer
设备:硬盘文件-------使用FileWriter
FileWriterfw = new Filewriter(“c.txt”);
需要提高效率吗? 需要----BufferedWriter
BufferedWritebufw = new BufferedWriter(fw);
扩展----------------------------------------------------------------------
想要把录入的数据按照指定的(utf-8)编码表,将数据存到文件中
此时要使用转换流---------OutputStreamWriter