---------------------------------------- android培训、java培训、期待与您交流! ------------------------------------
IO流体系的知识梳理与深化,用EditPlus以代码格式编写
IO流(重点) 设备之间的数据传输,由于会操作系统底层设备,io操作会抛 IOException,编程时要进行处理 要认清"流"的概念,read 是获取数据到流中,write是将流中的数据写出去 主要体系: 抽象基类,派生出的子类都是以父类作为后缀 ---------------------------------- IO继承体系"*"为较常用; "♂"&"♀"为成对使用 字符流继承体系 //Reader 实现接口Closeable, Flushable, 提供close()和flush()功能 Reader -->InputStreamReader "*"转换流又称桥梁流-->FileReader "*"//由此可见字符流在底层调用了字节流 -->BufferedReader "*"缓冲&装饰-->子类: LineNumberReader 行操作 -->CharArrayReader 操作字符数组 -->StringReader 操作字符串 //Writer 实现接口 Closeable, Flushable, Appendable 多一个append() Appendable接口出现于1.5版本 Writer -->OutputStreamWriter "*" -->FileWriter "*" //append方法用于添加字符 -->BufferedWriter "*" -->PipedWriter -->PrintWriter 打印流 "*" -->CharArrayWriter -->StringWriter 字节流继承体系: //InputStream 实现Closeable接口 close() InputStream -->FileInputStream "*" -->FilterInputStream 过滤流-->BufferedInputStream 字节流缓冲区(装饰) -->DataInputStream 操作基本数据类型 -->SequenceInputStream 合并流 -->ObjectInputStream"♀" 序列流 对象反序列化,将对象数据读取进流 -->PipedInputStream "♂" 管道流,发送 -->ByteArrayInputStream 操作字节数组 //OutputStream 实现Closeable, Flushable接口 close() & flush() OutputStream-->FileOutputStream "*" -->FilterOutputStream-->BufferedOutputStream -->PrintStream 打印流 -->DataOutputStream -->ObjectOutputStream "♂"对象序列化 持久化,对象需实现 Serializable "标记接口" -->PipedOutputStream"♀" 管道流,接收 -->ByteArrayOutputStream IO体系外其它相关类 File"*" 操作文件和目录 RandomAccessFile 随机读写 Properties 该类是 Hashtable 的子类,位于java.util包中 ----------------------------------- 字符流 FileReader 读入步骤: new FileReader(File)/*已有文件*/-->(循环)int read() ||int read(char[])-->操作--(-1 循环结束)-->close() FileWriter 写出步骤: new FileWriter(File)/*创建|覆盖*/-->(循环)write(...)-->flush()-->close() 文件续写: new FileWriter(File,true) ... //将true改为false就是覆盖原文件 字符文件的copy就是循环的read()和write() 字符流缓冲区:用于提高效率 "装饰类" BufferedReader 读入: new BufferedReader(new FileReader(File))-->(循环)String ReadLine()-->操作--(null 循环结束)-->close() 子类: LineNumberReader 使用方法: new LineNumberReader(new FileReader(File)) //.setLineNumber(int n)设置行号,从第n行开始readLine() || .getLineNumber()获取行号 BufferedWriter 写出: new BufferedWriter(new FileWriter(File))-->(循环)write(linne)-->newLine()-->flush()-->close() 使用缓冲区能够减少读写的次数,提高效率 设计模式之--"装饰设计模式"Decorator 当想要对已有对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,提供加强功能,自定的该类称为装饰类 readLine()是read()方法的增强,BufferedReader是FileReader类的增强类 相比继承扩展,装饰模式降低了两个类之间的关联度,避免了继承体系的臃肿,具有更高的灵活性和扩展性 ---------------------------------------------------------------- 字节流 FileInputStream 读入:new FileInputStream(File)-->(循环)int read() || read(byte[])-->操作--(-1 循环结束)-->close() 读入的第三种方式: new FileInputStream(File)--> new byte[ fis.available()]-->read(byte[])-->close() //available返回该文件对象有效的字节数,不使用循环而是一次性写入,文件较大时要慎用(JVM内存分配默认为64m) 在读写文件时,使用数组缓冲与单字节读写相比往往有数十倍的性能提升,可以使用"模板模式"来对比三种方法的效率 一般来说缓冲区大小为1M左右时效率是最高的,当然,不同系统环境也可能有差异 FileOutputStream 写出:new FileOutputStream(Fil