Day_12 IO

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类:对文件自身进行操作,例如:删除文件,文件重新命名等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值