File与IO流
一.Filie类
1.简介
java.io.File 类 表示磁盘上的文件和目录(文件夹)
- 无论是文件还是目录 File来表示
- File类提供了对文件和目录的基本操作,查询文件名,文件大小, 新建,删除
- File类不能操作文件的内容,如果要访问文件中的具体内容,需要用输入输出流
2.构造方法
路径分类
-
绝对路径
以根开始的路径
windows : 盘符 如: D:\xx\xx\xx.txt
Linux/Macos: / 正斜杠 /home/soft01/aa/a.txt
-
相对路径
相对于某个参照物的路径
构造方法 | 含义 |
---|---|
new File(String pathname) | 指定一个路径 |
new File(String parent, String child) | 指定一个父路径,一个子路径 |
new File(File parent,String child); | 指定一个父目录对象和子路径 |
3.常用方法
方法 | 含义 |
---|---|
getName() | 获取文件名称 |
getPath() | 获取路径 |
getAbsoultePath() | 获取绝对路径 |
length() | 获取文件大小 |
lastModified() | 获取最后修改的时间 |
exists() | 判断文件是否存在 |
isDirectory() | 判断是否是目录 |
isFile() | 判断是否是文件 |
getParent() | 获取父目录路径 |
getParentFile() | 获取父目录对象 |
isHidden() | 判断是否是隐藏文件 |
canRead() | 判断是否可读 |
canWrite() | 视频是否可写 |
方法 | 含义 | |
---|---|---|
createNewFile() | 创建文件 | |
delete() | 删除文件 | |
mkdir() | 创建目录 | |
mkdirs() | 级联创建目录 | |
list() | 获取当前目录下的文件和目录 的名字 | |
listFiles() | 获取当前目录下的File对象 |
二 IO流
1.简介
IO: input和 output 输入输出
流(Stream):可以理解为一组有顺序的有起点和终点的动态数据集合
- 文件是数据在磁盘上静态的存储
- 流就是数据在传输时动态的形式
- 通过IO流对文件进行读写操作
2.文件的分类
-
文本文件
可直接编辑的文件:ppt txt .java
-
二进制文件
除了文本文件
3.流的分类
按照三种标准来分
-
按照方向(站在java程序的角度)
输入流: (从文件到程序) ,用来读取文件的数据
输出流:(将程序到文件中),用来写出数据
-
按照流的单位
字节流:操作数据的单位为字节
字符流:操作数据的单位为字符
-
按照数据来源
节点流:直接对数据源进行操作
包装流:对节点流进行操作
IO流的四个父类/基类
字节流 | 字符流 | |
---|---|---|
输入(input) | 字节输入流(InputStream) | 字符输入流(Reader) |
输出(output) | 字节输出流(OutputStream) | 字符输出流(Writter) |
三.字节流
1.简介
InputStream是字节输入流的父类,常用子类
- FileInputStream
- ByteArrayInputStream
- ObjectInputStream
OutputStream是字节输出流的父类,常用子类
- FileOutputStream
- ByteArrayOutputStream
- ObjectOutputStream
2.文件输入输出流
2.1FileInputStream
文件字节输入流: 以字节为单位,从文件中读取数据
方法 | 含义 |
---|---|
read() | 读取一个字节,返回int类型的字节值,读到末尾返回-1 |
close() | 关闭流 |
read(byte[] b) | 每次读取多个字节,将读取的数据保存在数组中,返回实际读取的个数 |
2.2FileOutputStream
文件字节输出流: 以字节为单位,将数据写出的文件中
3.对象输入输出流
将java中的对象写入和读取,用IO流来操作java中的对象,我们称为对象的序列化 和 反序列化
属于包装流
- 不能直接操作数据源,而是对节点流进行操作
- 创建包装流,需要将一个节点流传入,作为基础流
3.1序列化和反序列化
序列化:将对象 写入IO流中,实现将对象保存在磁盘上
反序列化:从磁盘中读取对象,将文件中的对象恢复到程序中
对象序列化和反序列化 时需要实现Serializable接口
3.2 ObjectInputStream
对象输入流: 用来读取对象,实现 反序列化
3.3ObjectOutputStream
对象输出流:用来写对象,实现 序列化
4.字节数组输入输出流
数据的来源或者目的地都不一定是文件,也可以是内存中的一块空间 : 如 一个字节数组
4.1ByteArrayInputStream
字节数组输入流:将字节数组中的数据读出来
4.2ByteArrayOutputStream
字节数组输出流:将数据写入一个字节数组中
四.字符流
1.简介
Reader 是字符输入流的父类
- FileReader
- BufferedReader
- InputStreamReader
Writer 是字符输出流的父类
- FileWriter
- BufferedWriter
- OutputStreamWriter
2.文件字符输入输出流
2.1 FileReader
以字符为单位,读取数据
2.2FileWriter
以字符为单位,写入数据
3.缓冲输入输出流
缓冲流属于包装流,为字符添加了缓冲的功能
当读取或写出数据时,在缓冲区进行读写,减少对磁盘的IO操作,提高效率
4.转换流
用于将字节流转为字符流,同时可以实现编码的转换
在转换时可以指定使用的字符集
在java中没有提供字符流转为字节流的方法
五.RandomAccessFile
1.简介
随机读写流,是一个字节流,可以对文件进行随机读写
- 随机:可以定位到文件的任意位置进行读写,通过移动指针来实现
- 读写: 读取文件,写入文件
public static void main(String[] args) {
try(
/**
* 如果文件不存在
* r: 会报错
* rw: 自动创建
*/
RandomAccessFile raf = new RandomAccessFile("b.txt", "rw")
){
System.out.println(raf.getFilePointer());//当前指针的位置
raf.write("张三".getBytes());
raf.write("hello".getBytes());
System.out.println(raf.getFilePointer());//11
raf.seek(6);//将指针移动到指定位置
byte[] b = new byte[2];
raf.read(b);
System.out.println(new String(b));
System.out.println(raf.getFilePointer());//8
raf.skipBytes(3);//将指针跳过指定的字节数
System.out.println(raf.getFilePointer());
}catch (Exception e) {
// TODO: handle exception
}