本文主要是介绍文件IO流最详细的知识点,一点不落下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一、File类
- 1.概述
- 2.构造方法
- 3.创建功能
- 4.判断和获取功能
- 5.删除功能
- 二、递归
- 1.概述
- 2.解决问题思路
- 3.递归要解决问题就必须找到两个内容
- 三、IO流
- 1.概述
- 2.分类
- 四、字节流
- 1.字节流写数据
- 字节流抽象基类
- FileOutputStream:文件输出流用于将数据写入File
- 使用字节输出流写数据的步骤
- 字节流写数据的三种方式
- 字节流写数据的两个小问题
- 加异常处理
- 2.字节流读数据
- FileInputStream:从文件系统中的文件获取输入字节
- 步骤
- 一次读一个字节数组数据
- 3.字节缓冲流
- BufferedInputStream
- BufferedOutputStream
- 五、字符流
- 1.为什么会出现字符流?
- 2.编码
- 3.解码
- 4.字符流抽象基类
- Reader
- Writer
- 5.字符流写数据的5种方式
- 6.字符流读数据的2种方式
- 7.字符缓冲流
- BufferedWriter
- BufferedReader
- 8.复制文件的异常处理
- 六、特殊操作流
- 1.标准输入输出流
- 标准输入流
- 标准输出流
- 自己实现键盘录入数据
- 2.打印流
- 打印流分类
- 打印流特点
- 3.对象序列化流
- 对象序列化概念
- 对象序列化流:ObjectOutputStream
- 对象反序列话流:ObjectInputStream
- 4.Properties
- 概述
- Properties作为集合的特有方法
- Properties和IO流结合的方法
- 七、总结
一、File类
1.概述
- 它是文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象的
- 对File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已,它是可以存在的,也可以是不存在的,将来是要通过具体的操作把这个路径的内容转换为具体存在的
2.构造方法
3.创建功能
4.判断和获取功能
5.删除功能
- 如果同时删除目录和文件,需要先删除目录里面的内容再删除目录,不然会报错
二、递归
1.概述
- 以编程的角度来看,递归指的是方法定义中调用方法本身的现象
2.解决问题思路
- 把一个复杂的问题层层转化为一个与原问题相似的规模比较小的问题来求解
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
3.递归要解决问题就必须找到两个内容
- 递归出口:否则会出现内存溢出
- 与原问题相似的规模比较小的问题
三、IO流
1.概述
-
IO:输入/输出(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流是用来处理设备间数据传输问题,如文件复制,文件上传,文件下载等
2.分类
-
按照数据的流向
输入流:读数据
输出流:写数据
-
按照数据类型
字节流:字节输入流,字节输出流
用记事本打开,不能读懂内容,就使用字节流字符流:字符输入流,字符输出流
用记事本打开,能读懂内容,就使用字符流
四、字节流
1.字节流写数据
字节流抽象基类
-
InputStream:这个抽象类是表示字节输入流的所有类的超类
-
OutputStream:这个抽象类是表示字节输出流的所有类的超类
-
子类名特点
子类名称都是以其父类名作为子类名的后缀
FileOutputStream:文件输出流用于将数据写入File
- FileOutputStream(String name): 创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤
-
1、创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
-
2、调用字节输出流对象的写数据方法
-
3、释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
字节流写数据的三种方式
字节流写数据的两个小问题
-
字节流写数据如何实现换行?
写完数据后,加换行符
windows:\r\n
linux:\n
mac:\r -
字节流写数据如何实现追加写入呢?
public FileOutputStream(String name,boolean append)创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头
加异常处理
- finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源
- 特点:被finally控制的语句一定会执行,除非JVM退出
2.字节流读数据
FileInputStream:从文件系统中的文件获取输入字节
- FileInputStream(Stringname):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名
步骤
- 1、创建字节输入流对象
- 2、调用字节输入流对象的读数据方法
- 3、释放资源
一次读一个字节数组数据
- 步骤
1、创建字节输入流对象
2、调用字节输入流对象的读数据方法
3、释放资源
3.字节缓冲流
BufferedInputStream
-
概念
创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
-
构造方法
BufferedInputStream(InputStream in)
BufferedOutputStream
-
概念
该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
-
构造方法
BufferedOutputStream(OutputStream out)
-
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
字节缓冲流仅仅是提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
五、字符流
1.为什么会出现字符流?
-
由于字节流操作中文不是特别方便,所以Java就提供字符流
-
字符流=字节流+编码表
-
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数
2.编码
- 按照某种规则,将字符存储到计算机中,称为编码。
3.解码
- 将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码
- 按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号,否则就会乱码
4.字符流抽象基类
Reader
- 概念
字符输入流的抽象类
Writer
-
概念
字符输出流的抽象类
5.字符流写数据的5种方式
-
void flush():刷新流,必须刷新才能写进数据
-
close()自带刷新
-
当释放资源close()操作后,不能继续写数据
6.字符流读数据的2种方式
7.字符缓冲流
BufferedWriter
-
概念
将文本写入字符输出流。缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
-
构造方法
BufferedWriter(Writer out)
-
特有功能
void newLine():写一个行分隔符,行分隔符字符串由系统属性定义
BufferedReader
-
概念
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以默认大小,默认值足够大,可用于大多数用途
-
构造方法
BufferedReader(Reader in)
-
特有方法
public String readLine():读一行文字,结果包含行的内容的字符串,不包括任何行终止字符,如果流的结果已经到达,则为null
8.复制文件的异常处理
try…catch…finally的做法
jdk7改进方案
jdk9改进方案
六、特殊操作流
1.标准输入输出流
标准输入流
- public static final InputStream in: 通常该流对应于键盘输入或者由主机环境或用户指定的另一个输入源
标准输出流
- public static final PrintStream out: 通常该流对应于显示输入或由主机环境或用户指定的另一个输出目标
自己实现键盘录入数据
-
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
-
改进: Scanner sc=new Scanner(System.in)
输出语句的本质:是一个标准的输出流
2.打印流
打印流分类
-
字节打印流
PrintStream
PrintStream(String fileName):使用指定的文件名创建新的打印流
使用继承父亲的方法写数据,查看的时候会转码,使用自己的特有方法写数据,查看的数据原样输出 -
字符打印流
PrintWriter
构造方法
打印流特点
- 只负责输出数据,不负责读取数据
- 有自己的特有方法
3.对象序列化流
对象序列化概念
-
对象序列化就是将对象保存到磁盘中,或者在网络中传输对象
-
这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型,对象的数据和对象中存储的属性等信息
-
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
-
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行序列化
对象序列化流:ObjectOutputStream
-
将java对象的原始数据类型和图形写入OutputStream,可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储,如果流是网络套接字流,则可以在另一个主机或另一个进程中重构对象
-
构造方法
ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
-
序列化对象的方法
void writeObject(Object obj):将指定的对象写入ObjectOutputStream
-
注意
一个对象要想被序列化,该对象所属的类必须实现Serializable接口
Serializable是一个标记接口,实现该接口,不需要重写任何方法
对象反序列话流:ObjectInputStream
-
ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象
-
构造方法
ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream -
反序列化对象的方法
Object readObject():从ObjectInputStream读取一个对象 -
用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会出现问题,抛出InvalidClassException异常
-
解决办法
给对象所属的类加一个serialVersionUID
private static final long serialVersionUID = 42L; -
如果一个对象中的某个成员变量的值不想被序列化,给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
4.Properties
概述
- 是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
Properties作为集合的特有方法
Properties和IO流结合的方法
七、总结
这篇关于文件IO流最详细的知识点,一点不落下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!