一、File类
1.1 简介
相对路径:用普通的方法,则文件存于模块的文件目录下;用main方法,则文件存于整个工程的目录下。
1.2 使用
1.2.1 三个构造器
/或者\都能作为盘符使用。
file1为绝对路径,file2为相对路径,getAbsolutePath方法是为了取得file2的绝对路径信息。
1.2.2 方法使用
二、IO流
(常用文件流和缓冲流,缓冲流是升级版文件流,能够更快传输文件数据)
2.1 简介
类别:(从不同角度进行分类)
字符流是用来处理文本类文件的,而字节流是用来处理图片、音频等非文本文件的。
抽象基类为接口,都是声明其子类的对象,一般用访问文件那四个(节点流,也称为文件流)和缓冲流那四个(处理流),比如想要输入,则用FileInputStream或者BufferedInputStream。(缓冲流是用于文件较大的情况下,会比较快)
2.2 方法使用
2.2.1 节点流(文件流)
2.2.1.1 字符流
其中,len表示读取的字符的数量,括号里的0代表从数组第一个元素开始输出,直到第len个元素结束输出。
2.2.1.1.1 FileReader
输入流时文件一定要本身存在。
读写一般步骤:
**注意:**以上抛出异常的写法可能使得流资源无法关闭,因为在fr.read()方法进行时,有异常,则会跳至IOException中,而不会继续往下执行关闭操作,所以以上代码书写不够规范,规范的应该应用try catch finally来写(ctrl+alt+t快捷键),正确如下。
read()方法返回int值,表示每次读取的数据,需要转为char类型才能输出,读取全部数据后再次读取则会返回值-1,故while循环的终止条件是!=-1。
没有形参的read()方法只是简单输出一个一个字符,需用for循环才能将全部字符输入进来,而read(char[] cbuf)方法可以将读取的字符存储进char类型数组中,然后我们再把数组中的元素遍历出来即可。
len表示每次读入到cbuffer数组中的字符的个数。
**注意:**遍历数组时条件不是小于数组长度,否则显示的末尾数据会出现错误。
2.2.1.1.2 FileWriter
输出流时文件本身不在,则会直接创建;文件本身存在,对文件直接覆盖或者追加内容(所使用的构造器不同)。
一般步骤(与输入流相似):
2.2.1.1.3 注意点
2.2.1.2 字节流
2.2.1.2.1 FileInputStream与FileOutputStream
2.2.1.2.2 注意点
2.2.2 处理流
(此处处理流与节点流为一个层次,缓冲流与文件流为一个层次,只是节点流只有文件流,所以文件流=节点流)
2.2.2.1 缓冲流
对应关系:(缓冲流也分为输入与输出的字符流和字节流,与文件流里4个相对应,方法步骤等基本一致)
作用:提升文件读写的效率。
**注:**readLine()方法的使用,在打印时加换行符。
2.2.2.1.1 BufferedInputStream与BufferedOutputStream
2.2.2.1.2 BufferedReader与BufferedWriter
**注:**关闭资源close()方法时,会自动刷新一次,将数据写入磁盘文件中,如果没有close()且没有flush(),代码运行成功后也不会看到文件中的数据。在循环中加入flush()方法,则每次写入的数据能及时看到,而不至于等程序运行完成后才能看到。
2.2.2.2 转换流
字符与字节之间的转换
输入流InputStreamReader需要源文件与输入到程序中的字符集一致,输出流OutputStreamReader则程序中的字符集与文件中的字符集(转换成你想要的字符集)可以不一致。
2.2.2.2.1 InputStreamReader
创建的是字节流FileInputStream对象,读取文件时运用转换流解码为字符,注意用try catch finally才是最正确的。
在这里插入图片描述
2.2.2.2.2 InputStreamReader与OutputStreamReader
2.2.2.3 数据流
数据流能做的事,对象流都能做,而对象流能处理的一些事,数据流不能处理。
2.2.2.4 对象流
2.2.2.4.1 非自定义类
应该用try catch finally解决异常
2.2.2.4.1.1 ObjectOutputStream
2.2.2.4.1.2 ObjectInputStream
2.2.2.4.2 自定义类
比如自己创建一个person类,声明类中属性等,运用对象流对person类实现序列化和反序列化。