内存中的数据存储只是临时存储,再次运行程序数据丢失,不能持久化
持久化—>把数据从内存往其他存储设备存储的过程,而数据的传输需要有通道,由此有了流
流 —> 内存和其他设备之间传输数据的通道、管道
流的分类
按照方向 —> *** 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方法的返回值写到文件中,与对象序列化无关 ObjectOutputStream中writeObject(Object o)PrintWriter中print(object o)将整个对象字节信息写入到文件中,此过程被称为对象序列化;参与对象序列化的对象对应类需要实现java.io.Serializable接口只是将对象toString方法的String返回值写入到文件中,并不是对象序列化,所以参与写操作的对象对应类没有任何要求常用方法
构造方法
—> 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,反之
消极处理异常
积极处理异常 —> try catch finally
finally中语句不管有没有异常,一定被执行,所以将 I O 流资源释放放于finally中
积极处理异常 —> try with resources —> 自动释放资源
try( )//将流对象创建的语句定义此处()内,声明和创建对象需要一起完成 { //使用流进行实现业务逻辑 }catch(异常类型 e){ e.printStackTrack(); } //此语法自动完成流资源的释放System系统类,位于java.lang包中
out是System类中的静态属性,类型为PrintStream
println()是PrintStream流中方法
