-
内存中的数据存储只是临时存储,再次运行程序数据丢失,不能持久化
-
持久化—>把数据从内存往其他存储设备存储的过程,而数据的传输需要有通道,由此有了流
I / O流
-
流 —> 内存和其他设备之间传输数据的通道、管道
-
流的分类
-
按照方向 —> *** JVM内存***为参照物
- 输入流 —> 将其他存储设备中的数据读入到JVM内存中
- 输出流 —> 将JVM内存中的数据写入到其他存储设备中
-
按照单位
-
字节流 —> 以字节为操作单位 —> 可以操作所有类型的文件
-
字符流 —> 以字符为操作单位 —> 只能操作文本文件,即能以记事本打开同时不改变原有内容的文件,如.txt / .java / .c / .html都是文本文件。如 .class / .ppt / .mp4 等都是非文本文件
-
-
按照功能
- 节点流 —> 只具备基本的读写操作
-
过滤流 —> 在节点流的基础上增强功能
-
字节流
-
字节流父类InputStream —> 字节输入流 —> public abstract class InputStream都是抽象类
- read —> 对应读操作
-
字节流父类OutputStream —> 字节输出流 —> public abstract class OutputStream都是抽象类
- write —> 对应写操作
-
字节节点流
-
FileOutputStream —> 文件节点输出流(文件字节输出流)
-
常用构造方法
- FileOutputStream fos = new FileOutputStream(“文件路径 / 文件名”) —> 文件名需要带后缀
- 绝对路径 —> 盘符:/文件名/文件名/文件.txt 或两个\,有转义字符
- 相对路径 —> 文件夹 / 文件名.txt —> JVM在当前项目的根目录下查找所指定的文件夹和文件名
- 如果指定的文件路径中文件不存在,则JVM默认创建一个新文件,但是如果指定文件夹不存在,则运行报错,错误信息为 —> FileNotFoundException(文件找不到异常)
- 重载:第一个参数代表操作的文件路径及文件名,第二个参数代表是否在原有文件内容基础上进行追加—> true —> 追加,false —> 覆盖,默认为false
-
常用功能方法
- public voud write(int n) —> 将单个字节写入到文件中
-
FileInputStream —> 文件字节输入流()
-
常用构造方法
-
FileInoutStream fis = new FileInputStream(“文件路径 / 文件名”)
-
参数代表操作的文件路径及文件名
-
如果指定的文件不存在,则JVM不会默认创建文件,运行报错,错误信息为
—> FileNotFoundException(文件找不到异常)
-
-
常用功能方法
- public int read(); —> 一次从指定文件中读取一个字节的内容,如果达到文件尾部,返回-1
-
-
字节过滤流
-
BufferedOutputStream / BufferedInputStream
- 缓冲流,提高IO的读写效率,减少访问系统磁盘的次数
- 利用缓冲输入流进行写操作时,先将内容写入到缓冲区 ( JVM ) 中,利用flush()方法 / close()方法将缓冲区的内容一次性写入到文件中,并清空缓冲区
- flush() 清空缓冲区,同时将缓冲区内容一次性的写入到文件中,没有关闭流,流可以继续使用
- close()将流进行关闭,同时close方法底层调用flush方法将缓冲区的内容写入到文件中,此时流被关闭不能再继续使用。
- 如果缓冲区被不断的写入内容,满时会自动将缓冲区内容一次性写入到文件中,同时清空缓冲区
-
PrintStream
-
增强了操作八种基本数据类型、String的方法
-
print ( 形参 ) —> 写入不会自动换行
-
println ( 形参 ) —> 写入会自动换行
-
创建PrintStream对象时,可以直接给定操作的文件路径及文件名 —> PrintStream底层在构造方法中完成字节节点流的创建
public PrintStream(String fileName) throws FileNotFoundException{ this(false , new FileOutputStream(fileName)) }
-
仅为了方便打印输出各种类型数据信息,没有对应的输入流
-
-
ObjectOutputStream / ObjectInputStream
-
增强了操作八种数据类型、字符串等方法
-
writeObject ( Object o) : 将对象写入到文件中
-
Object readObject():从文件中读取一个对象,文件达到尾部则抛出异常
—> java.io.EOFException
-
对象序列化
-
对象在流上进行传输的过程
-
对象对应的类必须实现 java.io.Serializable 接口 —> 标记接口 ( 空接口 )
—> 若不实现接口报错:java.io.NotSerializableException(不可序列化异常)
-
被 transient 修饰的属性不参与序列化,读取时显示默认值
-
如果自定义类型的属性也参与对象序列化,则该属性对应的类也必须实现java.io.Serializable接口
-
集合对象也可以参与对象序列化 ( 集合类定义时已经实现java.io.Serializable 接口 ) ,如果集合中存储自定义类型的对象,则对象对应类必须实现 java.io.Serializable 接口
-
-
-
字符流
-
字符流父类
-
Reader —> 字符输入流,对应读操作
-
FileReader —> 文件字符输入流
-
构造方法 —> FileReader fr = new FileReader(“文件路径及文件名”); —> 指定文件必须存在,否则运行报错 —> FileNotfoundException(指定文件找不到异常)
-
常用方法
—> int read():一次从文件中读取一个字符的内容,将读取的字符内容作为返回值返回,如果达 到文件尾部,返回-1
-
-
Writer —> 字符输出流,对应写操作
-
FileWriter —> 文件字符输出流
-
构造方法 —> FileWriter fw = new FileWriter(“文件路径及文件名”); —> 相对路径、绝对路径均 可,若指定文件不存在,JVM默认创建一个新的文件,但是指定的文件夹必须存在,否则报错
—> FileNotFoundException ( 指定文件找不到异常 )
-
常用方法
—> void write(int n):将单个字符写入到文件中
—> void write(String str):将多个字符写入到文件中
-
-
字符过滤流
- BufferedReader —> 需要字符节点流为基础
- public String readLine():一次性读取一个文本行内容,读取内容作为返回值返回,如果达到 文件尾部返回null
- BufferedWriter —> 功能不强大,被PrintWriter取代
- PrintWriter —> 可以直接指定文件路径及文件名,因为底层做了基础流的封装
- 增强了八种基本数据类型、字符串、对象类型
- print(形参):打印不自动换行
- println(形参):打印自动换行
- print(Object obj) / println(Object obj):将对象写入到文件中 —> 本质把对象的toString方法的返回值写到文件中,与对象序列化无关
- BufferedReader —> 需要字符节点流为基础
-
ObjectOutputStream中writeObject(Object o) | PrintWriter中print(object o) |
---|---|
将整个对象字节信息写入到文件中,此过程被称为对象序列化;参与对象序列化的对象对应类需要实现java.io.Serializable接口 | 只是将对象toString方法的String返回值写入到文件中,并不是对象序列化,所以参与写操作的对象对应类没有任何要求 |
桥转换流
- OutputStreamWriter / InputStreamReader
- 输出流 / 输入流
- 字节流和字符流之间转换通道
- 可以设置编解码格式 —> 使用构造方法即可
- 桥转换流读写方法通常不用,使用过滤流进行功能加强 —>PrintWriter/BufferedReader 增强读写功能
File 类 —> 位于java.io包中
File 类 | I O流 | |
---|---|---|
区别 | 对文件本身进行设置和操作,如删除文件、更换文件名等 File代表文件或文件夹 | 直接对文件中内容进行操作,如读文件或写文件内容 |
-
常用方法
-
构造方法
—> File(String name):指定操作文件的路径及文件名
-
成员方法
—> public boolean createNewFile():创建新的文件,成功为true,否则false
—> public boolean mkdir():创建文件夹,成功为true,否则false
—> public boolean delete():删除指定的文件或文件夹;文件夹必须为空,文件无限制
—> ***public String getName()***:获取文件名(含扩展名)
—> ***public String getAbsolutePath()***:获取文件的绝对路径
—> boolean exists():判断文件是否存在,存在true,否则false
—> File[] listFiles():获取指定文件夹中所有文件或文件夹
—> boolean isDirectory():判断是否为文件夹,是true,反之
—> boolean isFile():判断是否为文件,是true,反之
-
I O流异常的处理:
-
消极处理异常
-
积极处理异常 —> try catch finally
-
finally中语句不管有没有异常,一定被执行,所以将 I O 流资源释放放于finally中
-
积极处理异常 —> try with resources —> 自动释放资源
try( )//将流对象创建的语句定义此处()内,声明和创建对象需要一起完成 { //使用流进行实现业务逻辑 }catch(异常类型 e){ e.printStackTrack(); } //此语法自动完成流资源的释放
-
System系统类,位于java.lang包中
out是System类中的静态属性,类型为PrintStream
println()是PrintStream流中方法
常见编码
- 编码名称不区分大小写
常见编码 | |
---|---|
ISO8859-1 | 西欧编码 |
ASCII | 美国信息编码规范 |
GBK | 中国简体,常用 |
GB2312 | 中国简体,收录中国常用汉字,目前不常用 |
GB18030 | 中国简体,收录中国所有符号,七万左右 |
big-5 | 中国繁体,中国台湾使用 |
UTF-8 | 万国码,底端采用动态编码,中国汉字占2-3字节 |
- 编码和解码
- 编码 —> 将字符对应的十进制转换为二进制的过程
- 解码 —> 将二进制转换为对应十进制同时显示为对应字符的过程
- 只有编码和解码方式统一,才不会出现乱码 —> 即编码参照表一致