------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
io体系 | 字节流 | InputStream,OutputStream(抽象父类) |
字符流 | Reader,Writer(抽象父类) | |
子类 | 在父类的名称前加上前缀 | |
FileWriter(Writer的孙子,爹是OutputStream) | 构造方法 | 没有空参构造,该对象一被初始化必须创建要操作的文件 |
1、FileWriter(String fileName) 如:FileWriter fw=new FileWriter("C:\\users\\罗志辉\\desktop\\hello.txt") 该对象一被创建并会在指定的目录下生成指定的文件如果该目录下存在同名文件,如果写入会将原文件内容清空,再写入(不是删除) 2、FileWriter(String str,boolean flag) 该构造方法会判断flag,如果传入的true,表示如果存在同名文件,那么在同名文件的末尾续写,如果为false表示不续写,清空掉文件内容 | ||
方法特点 | 所有方法都是继承自爹、爷爷、祖宗;且大部分会抛出IOException | |
写入方法 | void write(String str) 诸多重载参数类型可以是字符数组、字符数组的一部分、字符(int形式)、字符串、字符串的一部分,但注意如果是写入一部分时,两个int参数的意思是起始位置,要获取的数量 这些方法会将数据写入到FileWriter流中,注意在windows下换行是以\r\n来表示 | |
刷新 | public abstract void flush() 该方法将清空流中的数据,并将其输出到该流指定的文件中 | |
关闭 | public abstract void close() 该方法将调用一次flush,并关闭该流,以避免占用系统资源,应将此句至于finally中 | |
FileReader(Reader的孙子,爹是InputStream) | 构造方法 | 1、FileReader(String fileName) |
方法特点 | 同FileWriter | |
读取方式1 | public int read() 该方法一次读取一个字符,并返回该字符的int类型,如果读到流的末尾,则返回-1 | |
读取方式2 | public int read(char[n] cbuf) 该方法一次读取多个字符,并将其char值(不是int)存入数组中,返回读取的个数,如果读到流的末尾,则返回-1,这里注意如果给定的数组长度小于字符数,那么再次读取时会从头开始存,并覆盖掉原来的字符,如假设定义一个长度为3的数组来存储读取的数据,假设数据是“abcd”,那么第一次读取时,数组中存入abc,方法返回3,第二次读取时,数组中的字符变成dbc了,返回1 在实际应用中,一般将用来存储读取到的字符的数组的长度定为1024 | |
关闭 | public abstract void close() 注意与输出流相比,该方法不会再调用read方法 | |
装饰设计 模式Decorator Pattern | 概念 | 在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能 |
原理 | 通过创建一个包装对象,也就是装饰来包裹真实的对象 | |
特点 | 1、装饰对象和真实对象有相同的接口 2、装饰对象包含一个真实对象的引用 3、装饰对象将所有请求转发给真实的对象来完成 4、装饰对象在转发请求时可以增加一些附加功能 | |
适用情形 | 需要拓展一个类的功能,不便使用或不能使用继承; 需要动态的给一个对象添加功能 | |
优缺点 | 灵活、扩展性强;更复杂 | |
典型步骤 | 1、类中设置成员变量,该变量为需要扩展类(或其父类、实现类)的引用 | |
2、(无参)构造方法中创建对象传递给该引用 或(有参)该构造方法接收一个需要扩展类的实例参数并传递给该引用 | ||
3、方法内使用该引用调用其扩展类的方法,并在此基础上扩展该方法 | ||
4、复写装饰类与被扩展类的接口或抽象父类的的抽象方法 | ||
BufferedWriter和BufferedReader | 概念 | 为Reader和Writer功能提供缓冲,从而提高读写效率,使用的是Decorator Pattern |
BufferedReader构造 | BufferedReader(Reader in) 默认大小缓冲字符输入流 | |
BufferedReader(Reader in, int sz) 指定大小缓冲字符输入流 | ||
BufferedWriter构造 | BufferedWriter(Writer out) 默认大小缓冲输出流 | |
BufferedWriter(Writer out, int sz) 指定大小缓冲输出流 | ||
写入换行 | public void newLine()throws IOException 所有系统通用的写入换行方式 | |
读取行 | public String readLine()throws IOException 读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。使用该方法读取的流在写入时,应加上换行 | |
LineNumberReader | 概念 | 带行属性的缓冲输入流,是Bufferedreader的子类,构造方法与其类似(仅名称不同) |
设置获取行号 | public int getLineNumber() 获取当前行号 | |
public void setLineNumber(int lineNumber) 设置当前行号 | ||
io异常处理 | 思考1 | 由于创建对象、读写数据、关闭流都存在异常,因此全部要放在try中 |
思考2 | 关闭流资源的动作无论如何都要执行,应放在finally中 | |
思考3 | 如果将close移到finally中,那么对象的引用就不在同一个作用范围了,因此,在之前的try外面创建一个引用,指向null,然后在try的内部创建对象,并将地址赋给该引用 | |
思考4 | 放在finnally中的close需要单独try catch,因为它也会抛出异常,并且如果有多流的时候需要对每个流单独try-catch,这是因为如果只用一个try的话,如果第一个流在关闭时就报异常了,那么会导致后面的close方法不会执行,从而关闭资源的动作失败。也可以将后面的close放在排在它前面的close的try代码体系的finally中,再对其进行try-catch,但这样做代码结构太复杂,建议并列try-catch | |
思考5 | 如果之前try捕获了异常,那么finally中的对象引用就指向空了,调用close会发生空指针异常,因此,需要在close方法前加加上判断是否为空 | |
io异常处理1.7新特性 | 方式 | 将创建对象的代码放在try的小括号中,其他执行代码放在大括号中,这样大括号代码运行完毕后会自动关闭资源,即 try(创建对象){} |
注意 | 所创建的类实例必须是可自动关闭的,即必须实现AutoCloseable(closeable的爹),并且复写方法close() |