Day 12 I/O框架
概念
内存中的数据存储只是临时存储,再次运行程序数据丢失,不能持久化。
持久化:就是把数据从内存往其它存储设备存储的过程,数据的传输需要通道,由此有了流的概念。
流就是内存与存储设备之间传输数据的通道、管道。
数据借助流传输类比于水库中的水借助管道传输:
IO流的分类
按方向(以JVM虚拟机为参照物)【重点】
输入流:将<存储设备>中的内容读入到<内存>中。
输出流:将<内存>中的内容写入到<存储设备>中。
按单位:
字节流:以字节为单位,可以操作所有类型的文件
字符流:以字符为单位,只能操作文本类型的文件(即可以用记事本打开的文件,例如:.java .c .txt .html等)
按功能:
节点流:具有基本的读写功能。
过滤流:在节点流的基础上,增加新的功能。
字节流
字节流的父类(抽象类):
节点流
FileOutputStream:文件字节输出流
FileOutputStreaam fos = new FileOutputStream("E:\\a.txt");
//绝对路径:盘符:\\文件夹名\\文件名 或 盘符:/文件夹名/文件名
//创建文件字节输出流时,如果指定的文件不存在,则系统会自动创建一个文件,但是文件夹必须提前创建
FileOutputStream fos = new FileOutputStream("a.txt");
//相对路径:默认在当前项目的根目录下查找
//如果指定的文件不存在,则系统会自动创建一个新文件,但是文件夹必须提前创建
FileOutputStream fos = new FileOutputStream("file\\a.txt");
//常用的创建字节输出流的方式
在文件中多次追加新内容:
FileOutputStream fos = new FileOutputStream("a.txt");
//默认覆盖原有文件中的内容
FileOutputStream fos = new FileOutputStream("a.txt",true);
//第一个参数代表文件的路径
//第二个参数代表是否覆盖原有文件的内容,boolean类型值
//true:在原有基础上追加新内容
//false:写入新内容时,会覆盖文件中原有的内容
常用方法:
public void write(int n):将单个字节写入到文件中
public void write(byte[] b):将一组字节写入到文件中
public void write(byte[] b , int off , int len):将字节数组的部分内容一次性的写入到文件中(从下标off开始,写入的字节个数为len)
FileInputStream:文件字节输入流
FileInputStream fos = new FileInputStream("file\\a.txt");
//参数:代表要读取哪一个文件中的内容
//如果指定的文件夹不存在,则系统不会自动创建,而是抛出异常
FileInputStream继承InputStream中的方法:
public int read():一次只读一个字节的内容,返回值代表读取到的字节内容,如果达到文件的尾部,则返回 -1。
public int read(byte[] b):一次性读取多个字节的内容,并把读到的内容存储在字节数组b中,返回值代表实际读取到的字节数,如果达到文件的尾部,则返回-1。
public int read(byte[] b,int off,int len):一次性读取多个字节的内容,并把读到的内容存储在字节数组b中(从off开始存储,读取的字节长度为len),返回值代表实际实际读取到的字节数,如果达到文件的尾部,则返回-1。
过滤流
过滤流:BufferedOutputStream / BufferedInputStream
缓冲流,提高IO效率,减少访问磁盘的次数
数据存储在缓冲区中,flush是将缓冲区的内容写入文件中,也可以直接close
过滤流:DataOutputStream / DataInputStream
除了基本的读写操作,还可以操作8种基本数据类型
• writeByte( int n)/ readByte ()
• writeShort( int n)/ readShort ()
• writeInt( int n)/ readInt ()
• writeLong (long n)/ readLong ()
• writeFloat (float f)/ readFloat ()
• writeDouble(double d) / readDouble ()
可以操作String数据:writeUTF(String str) / readUTF()
过滤流:ObjectOutputStream / ObjectInputStream
增强了缓冲区功能
增强了读写8种基本数据类型和字符串的功能
增强了读写对象的功能
readObject() //从流中读取一个对象,读到文件尾部时,会抛出EOFException异常
writeObject(Object obj) //向流中写入一个对象
对象放在流上进行传输的过程称为对象的序列化
对象序列化时必须保证对象是可序列化的,必须保证这个类实现java.io.Serializable。
被transient修饰的属性,不参与序列化
如果对象的属性,是自定义类型的对象时,则该对象也必须是可序列化的;
如果对集合对象序列化,必须保证该集合中的所有元素时可序列化的。
字符流
这里写图片描述处理中文字符,需要用到字符流
编码
编码 | 备注 |
---|---|
ISO8859-1 | 西欧 |
GBK | 简体中文 |
BG2312 | 简体中文 |
GB18030 | 简体中文 |
BIG5 | 繁体中文-台湾 |
UTF-8 | 万国码 |
字符流的父类(抽象类):
FileWriter
FileWriter文件字符输出流,继承Writer中的方法:
public void write(int n):将单个字符写入到文件中
public void write(String str):一次性写入多个字符
FileReader文件字符输入流,继承Reader中的方法:
public int read():一次读取一个字符的内容
public int read(char[] c):一次性读取多个字符的内容,将读取到的内容存储在char类型的数组中,返回值代表实际读取的字符个数,达到文件的尾部返回-1。
public int read(char[] c,int off,int len):一次性读取多个字符的内容,将读取到的内容存储在char类型的数组中,存储的起始下标为off,读取的字符个数为len,返回值代表实际读取的字符个数,达到文件的尾部返回-1。
过滤流
BufferedReader / PrintWriter:缓冲流
public String readLine():一次读取一个文本行的内容,达到文件尾部时,返回null。
public void println (String str):写入字符串后自动换行
InputStreamReader / OutputStreamWriter:桥转换流
桥转换流的作用:将字节流转换为字符流,转换的桥梁,同时可以设置字符的编码格式
步骤总结:
创建字节节点流
创建桥转换流,同时设置编解码方式
包装过滤流,方便读写操作
读/写操作
关闭流:只需要关闭最外层流
File类
IO流:对文件中的内容进行操作。
File类:对文件自身进行操作,例如:删除文件,文件重新命名等。