字节流:可以从或向一个特定方向读写数据,读写字节数据 封装流/处理流:针对字节流进行封装,即一个已经存在的流进行封装 通过封装流能够对数据更有效的读写,封装流的底层还是字节流 通常字节流被称为低级流 处理流被称为高级流或者过滤流 InputStream: 字节流:可以从或向一个特定方向读写数据,读写字节数据 封装流/处理流:针对字节流进行封装,即一个已经存在的流进行封装 通过封装流能够对数据更有效的读写,封装流的底层还是字节流 通常字节流被称为低级流 处理流被称为高级流或者过滤流 InputStream: 所有的字节流的父类,其定义了基础的读取方法 -int read() 读取一个字节,以int的形式返回,该int的低八位有效 否则返回-1,表示文件末尾EOF end of file -int read(byte[] buf) 尝试最多读取给定数组length(数组长度)个字节,并存入该数组 返回值为实际读取的字节量的长度,否则返回-1 -int read(byte[] buf,int offset,int len) 将输入流中的最多len个字节写入byte数组 将从offset的 位置开始写入数组,len不能超过数组的实际长度 超过数组的实际长度会报数组下标越界异常 -void close() 关闭此输入流,释放与该流关联的所有系统资源 OutputStream:所有字节流的父类,其定义了基础的写出方法 -void write(int d) 写出整型数据的低八位 -void write(byte[] b) 将给定的字节数组的数据全部写出 -void write(byte[] b,int offset,int len) 将给定的字节数组从偏移量offset开始的len个字节写入输入流 -void flush() 刷新此输出流,并强制写出所有缓冲的输出字节 -void close() 关闭此输出流,并释放与此输出流的相关所有系统资源 FileInputStream:文件输入流 -操作文件内容, -操作的是字节流 -继承自InputStream抽象类 -低级流,操作的是文件 FileOutputStream:文件输出流 -操作文件内容 -操作的是字节流 -继承自OutputStream抽象类 -低级流,操作的是文件 缓冲流:Buffer缓冲 高级流之一 缓冲流的原理: 向硬件存储设备操作数据,导致增大跟硬件的交互次数, 会降低读写的速度,做缓冲流的目的就是为了尽量减少 跟硬件的交互次数 缓冲输出流原理:BufferedOutputStream缓冲输出流内部会维护 一个缓冲区,每当我们向该流写出数据时,都会先将数据存入缓冲区 当缓冲区已满的时候,缓冲流会将数据一次性写出 注意: void flush(),清除缓冲区,将缓冲区中的数据强制写出 以保证数据完整 缓冲输入流原理:BufferedInputStream缓冲输入流内部维护一个 缓冲区,每当我向该流读入数据,都会先将数据存入缓冲区, BufferedInputStream的read方法会从缓冲区去读取数据, 当缓冲区全都读取完毕,如果再次read的时候,会在一次 把缓冲区填满,read在逐一从从缓冲区中读取数据,以此往复 缓冲是靠牺牲内存来提升io的读写效率的 案例: 数据流: 高级流之一 DataInputStream:数据输入流,适合对java基本类型的输入 构造函数: DataInputStream(InputStream) Api方法: readInt(); 类似的方法 readXXX();//XXX代表具体类型 DataOutputStream:数据输出流,适合对java基本类型的输出 构造函数: DataOutputStream(OutputStream) Api方法: writeInt(); 类似的方法:writeXXX();//XXX代表具体类型 字符流: 针对字节流做低级流的二次或者三次封装或者处理 字符流的本质还是字节流 -Reader类: -所有字符流的父类 -是一个抽象类 -int read() 读取一个字符,占用整个整型数据的低16位,低16位有效(因为char占用两个字节) -int read(char[] chars) 从流中读取一个字符数组长度个字节,并存储到该字符数组中 返回的是实际读取的字符量 -int read(char[] chars,int offset,int len) 读取len个字符,存储到字符数组,以offset为起点 -Writer类 所有字符流的父类 是一个抽象类 -void write(int c) 写出一个字符 -void write(char[] chars) 写出一个字符数组的数据 -void write(chars[] chars,int offset,int len) 从字符数组写出数据,从offset开始,取len个字符 -void write(String str) 写出一个字符串 -void write(String str,int offset,int len) 写出字符串中的部分数据,指定从offset开始,长度为len -InputStreamReader类 可以设置字符集 按照指定的字符集输入数据 将字节按照指定的字符集写出字符串数据 继承自Reader类 OutputStreamWriter类 可以设置字符集 按照指定的字符集输出数据 将字节按照指定的字符集写出字符串数据 继承自Writer类 缓冲字符流: 缓冲字符流自己维护一个字符数组 -BufferedReader类:缓冲字符流输入 String readLine();//读取一行数据,读取到文件末尾为null -BufferWriter类: 缓冲字符流输出 PrintWriter类: 特殊的类,只有输出,没有输入 具有自动刷新的缓冲字符输出流 对象流 高级流之一 把内存的对象数据序列化到硬盘上,也可以把硬盘上的文件反序列化回内存的对象 序列化: 把内存的对象序列化到硬盘上,以字节的方式体现 反序列化: 把硬盘上的字节序列,反序列化为内存中的对象 比如: Student stu = new Student("张三",20,"s001"); stu-->硬盘(序列化)-->内存堆中出现stu对象(反序列化) 注意: 实现对象的序列化合反序列化,就必须对序列化的对象 所对应的类实现java.io.Serializable接口 且类中最好给提供一个long类型的序列化版本号 比如: public class Student implements Serializable{ private static final long serialVersionUID = 1L; //filed 属性 //method 方法 } java.io.Serializable接口 子接口仅表示可序列化的语义,某各类实现了这个接口,表示此类可以被序列化,这个类的子类也可以被序列化 这个类需要提供一个常量serializableUID,用来表示本类的序列化版本号 如果想跨平台,就需要显示声明一个版本号 且平台两端的版本必须相同 序列化的类中可以有很多的属性,但是部分属性是不想被序列化和反序列化的 把类中不需要序列化的属性加上transient修饰符 transient:原意是瞬间的,短暂的,临时的 比如: 所有的字节流的父类,其定义了基础的读取方法 -int read() 读取一个字节,以int的形式返回,该int的低八位有效 否则返回-1,表示文件末尾EOF end of file -int read(byte[] buf) 尝试最多读取给定数组length(数组长度)个字节,并存入该数组 返回值为实际读取的字节量的长度,否则返回-1 -int read(byte[] buf,int offset,int len) 将输入流中的最多len个字节写入byte数组 将从offset的 位置开始写入数组,len不能超过数组的实际长度 超过数组的实际长度会报数组下标越界异常 -void close() 关闭此输入流,释放与该流关联的所有系统资源 OutputStream:所有字节流的父类,其定义了基础的写出方法 -void write(int d) 写出整型数据的低八位 -void write(byte[] b) 将给定的字节数组的数据全部写出 -void write(byte[] b,int offset,int len) 将给定的字节数组从偏移量offset开始的len个字节写入输入流 -void flush() 刷新此输出流,并强制写出所有缓冲的输出字节 -void close() 关闭此输出流,并释放与此输出流的相关所有系统资源 FileInputStream:文件输入流 -操作文件内容, -操作的是字节流 -继承自InputStream抽象类 -低级流,操作的是文件 FileOutputStream:文件输出流 -操作文件内容 -操作的是字节流 -继承自OutputStream抽象类 -低级流,操作的是文件 缓冲流:Buffer缓冲 高级流之一 缓冲流的原理: 向硬件存储设备操作数据,导致增大跟硬件的交互次数, 会降低读写的速度,做缓冲流的目的就是为了尽量减少 跟硬件的交互次数 缓冲输出流原理:BufferedOutputStream缓冲输出流内部会维护 一个缓冲区,每当我们向该流写出数据时,都会先将数据存入缓冲区 当缓冲区已满的时候,缓冲流会将数据一次性写出 注意: void flush(),清除缓冲区,将缓冲区中的数据强制写出 以保证数据完整 缓冲输入流原理:BufferedInputStream缓冲输入流内部维护一个 缓冲区,每当我向该流读入数据,都会先将数据存入缓冲区, BufferedInputStream的read方法会从缓冲区去读取数据, 当缓冲区全都读取完毕,如果再次read的时候,会在一次 把缓冲区填满,read在逐一从从缓冲区中读取数据,以此往复 缓冲是靠牺牲内存来提升io的读写效率的 案例: 对象流 高级流之一 把内存的对象数据序列化到硬盘上,也可以把硬盘上的文件反序列化回内存的对象 序列化: 把内存的对象序列化到硬盘上,以字节的方式体现 反序列化: 把硬盘上的字节序列,反序列化为内存中的对象 比如: Student stu = new Student("张三",20,"s001"); stu-->硬盘(序列化)-->内存堆中出现stu对象(反序列化) 注意: 实现对象的序列化合反序列化,就必须对序列化的对象 所对应的类实现java.io.Serializable接口 且类中最好给提供一个long类型的序列化版本号 比如: public class Student implements Serializable{ private static final long serialVersionUID = 1L; //filed 属性 //method 方法 } java.io.Serializable接口 子接口仅表示可序列化的语义,某各类实现了这个接口,表示此类可以被序列化,这个类的子类也可以被序列化 这个类需要提供一个常量serializableUID,用来表示本类的序列化版本号 如果想跨平台,就需要显示声明一个版本号 且平台两端的版本必须相同 序列化的类中可以有很多的属性,但是部分属性是不想被序列化和反序列化的 把类中不需要序列化的属性加上transient修饰符 transient:原意是瞬间的,短暂的,临时的 比如: