文件操作 和 IO 流
1.文件操作
Java 中,文件操作是基本的编程技能之一。Java 提供了丰富的文件操作方法和API,可以轻松地访问、读取、写入和操作文件。
1.1 File 类和路径问题
File 类是SUN 公司提供给程序员使用,用于操作文件和文件夹的一种方式,可以完成针对于文件和文件夹的增删改查操作。
文件路径:
当需要操作文件时,需要知道它的路径,Java 中有两种文件路径,绝度路径与相对路径。
绝对路径:指文件的完整路径,以文件系统根目录或磁盘盘符为基础,到指定为文件或文件夹的唯一路径。
Windows 操作系统是以盘符开始到目标文件或者文件夹的路径(唯一)
Linux/UNIX 操作系统是以 / 跟目录为起点的路径(唯一)
相对路径:相对于当前目录的文件路径,即以当前路径为参照,去往其他工作目录的路径。
1.1.1 相关方法
File(String file);
根据指定的文件路径,和 new 关键字配合实例化对应的 File 对象
File file = new File("D:/a/1.txt");
System.out.println(file);
File(String parent, String childName);
根据指定的父目录路径和子文件夹的名称,和 new 关键字配合实例化对应的 File 对象
File file = new File("D:/a", "1.txt");
System.out.println(file);
File(File parent, String childName)
根据指定的父目录 File 对象和子文件或者子文件夹的名称,和 new 关键字配合实例化对应的 File 对象
File file = new File("D:/a");
File file1 = new File(file, "1.txt");
System.out.println(file1);
1.2 文件相关操作
Java 中提供了一系列方法,用于创建、读取、写入和删除文件。
1.2.1 文件或者文件夹创建操作
文件创建操作
boolean createNewFile();
通过 File 对象调用,创建 File 对象存储路径对应的普通文件。
创建失败原因:
1. 路径不合法
2. 对应文件已存在
3, 对应文件没有写入权限
File file = new File("1.txt");
boolean res = file.creatNewFile();
if (res) {
System.out.println("文件创建成功");
} else {
System.out.println("创建失败");
}
文件夹创建操作
boolean mkdir();
通过 File 对象调用,创建 File 对象存储路径对应的文件夹
创建失败原因:
1. 路径不合法
2. 对应文件已存在
3. 对应文件夹没有写入权限
File file = new File("D:/a/b");
res = file.mkdir();
if (res) {
System.out.println("创建成功");
} else {
System.out.println("创建失败");
}
多层文件夹创建操作
boolean mkdirs();
通过 File 对象调用,创建 File 对象存储路径对应的文件夹,包括中间路径
File file = new File("D:/a/1/2/3/4/5/6/7/8/9");
res = file.mkdirs();
if (res) {
System.out.println("创建成功");
} else {
System.out.println("创建失败");
}
文件移动操作
boolean renameTO(File dest);
可以用于文件移动,重命名操作,通过 File 对象调用,将对应文件或文件夹转移到 dest
File file1 = new File("D:/a/1.txt");
File file2 = new File("D:/a/b/2.txt");
res = file1.rename(file2);
if (res) {
System.out.println("移动成功");
} else {
System.out.println("移动失败");
}
1.2.2 文件删除操作
boolean delete();
通过 File 类对象调用,直接删除 File 对象对应的文件或者文件夹,要求文件夹不能有内容,必须是空文件夹。该方法要慎用,因为调用该方法删除的文件或者文件夹不会放入回收站中,而是被直接抹除数据。
File file = new File("D:/a/1.txt");
res = file.delete();
if (res) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
void deleteExit();
通过 File 类对象调用,在程序退出之后,删除 File 对象对应的文件或者文件夹,可以用于清理缓存文件,缓冲文件夹...
new File("D:/a/1.txt").deleteOnExit();
1.2.3 判断方法
boolean isFile();
通过 File 类对象调用,判断是否为普通文件
File file = new File("D:/a/1.txt");
System.out.println("是否为普通文件:" + file.isFile());
boolean isDirectory();
通过 File 类对象调用,判断是否为 文件夹
File file = new File("D:/a/1.txt");
System.out.println("是否为文件夹:" + file.isDirectory());
boolean exists();
通过 File 类对象调用,判断 File 类对象对应文件或者文件夹是否存在
File file = new File("D:/a/1.txt");
System.out.println("是否存在:" + file.exists());
boolean isAbsolute();
通过 File 类对象调用,判断是否使用【绝对路径】
File file = new File("D:/a/1.txt");
System.out.println("是否使用绝对路径:" + file.isAbsolute());
boolean isHidden();
通过 File 类对象调用,判断文件或者文件夹是否为隐藏文件
File file = new File("D:/a/1.txt");
System.out.println("是否为隐藏文件:" + file.isHidden());
1.2.4 文件相关数据获取
与文件是否存在无关,仅为字符串解析方法
String getPath();
获取 File 类对象存储路径信息
String getParent();
获取 File 类对象存储路径信息的父目录
String getName();
获取 File 类对象存储路径信息的文件或者文件夹名
File file = new File("D:/a/1.txt");
System.out.println("Path:" + file.getPath());
System.out.println("ParentPath" + file.getParent());
System.out.println("Path:" + file.getName());
与文件存在有一定的相关性
long length();
通过 File 类对象调用,获取文件大小,如果是文件夹,返回值为 0L
long lastModified();
通过 File 类对象调用,获取文件或者文件夹的最后修改时间
String getAbsolutePath();
获取指定文件或者文件夹的绝对路径
File getAbsoluteFile();
获取指定文件或者文件夹的绝对路径对应 File 对象
File file = new File("D:/a/1.txt");
long length = file.length();
System.out.println("文件字节数:" + length);
long modified() = file.lastModified();
System.out.println(modified);
String absolutedPath = file.getAbsolutePath();
System.out.println(absolutedPath);
File absoluteFile = file.getAbsoluteFile();
System.out.println(absoluteFile);
1.2.5 文件列表方法
public static File[] listRoots();
有且只有 Windows 有效,可以获取所有盘符信息。
Arrays.stream(File.listRoots()).forEach(System.out::println);
String[] list();
通过 File 类对象调用,获取对应文件夹中所有子文件或者子文件夹的名称
System.out.println(Arrays.toString(file.list()));
2. IO流
2.1 IO 流概述
I/O 流提供了一种处理数据的方式,数据可以通过流在应用程序和文件之间传输。Java 中的 I/O 流是通过Java API 提供的,Java IO API 提供了丰富的类库,可以对不同种类的数据进行读写操作。I/O 流解决的问题是程序到文件之间的数据传递过程,包括:文件内容操作,文件上传,文件下载等
在 Java 中,I/O 流主要被分为输入流和输出流两类。I 为 input 输入, O 为 output 输出。输入输出的参照物是当前程序占用的内存,数据从内存中离开(output), 数据读取到内存(input)
2.2 IO流分类
流向划分
输入流 和 输出流
处理数据单位/单元
字符流:只能操作可以使用记事本打开的普通可视化文本文件,且受到编码集约束
可以分为:字符输入流 和 字符输出流
字节流:使用最多,可用于文件上传,文件下载…适用于所有类型文件
可以分为:字节输入流 和 字节输出流
2.3 文件操作字节输入流
2.3.1 相关方法
FileInputStream 构造方法
FileInputStream(String filePath);
根据指定的文件路径,创建对应当前文件的文件操作字节输入流对象
FileInputStream(File file);
根据指定的文件 File 对象,创建对应当前文件的文件操作字节输入流对象
读取操作相关方法
int read();
从文件中读取一个字节数据返回,返回值类型为 int 类型,实际有效数据为 byte
int read(byte[] buffer); 【使用最多】
从文件中读取数据到 byte 类型的缓冲数组中,返回值类型是本次读取操作存储到 byte 缓冲数组中的字节个数
int read(byte[] buffer, int offset, int length);
从文件中读取数据到 byte 类型的缓冲数组中,要求从 offset 下标位置开始,到 length 计数结束,返回值是读取到数组中的字节个数
2.3.2 流程
// 1. 明确文件路径
String filePath = "D:/a/1.txt";
// 2. 创建 FileInputStream 文件操作字节输入流对象,打开文件操作输入管道
FileInputStream input = new FileInputStream(filePath);
// 3. 读取数据操作
// 3.1 创建一个 byte 类型数组
byte[] buffer = new byte[1024 * 32];
int length = -1;
// 3.2 读取数据到 buffer 数组中
while ((length = input.read(buffer)) != -1) {
}
// 4. 关闭资源
input.close();
2.4 文件操作字节输出流
2.4.1 相关方法
FileOutputStream 构造方法
FileOutputStream(String filePath);
根据指定的文件路径,创建对应当前文件的文件操作字节输出流对象
FileOutputStream(File file);
根据指定的文件 File 对象,创建对应当前文件的文件操作字节输出流对象
FileOutputStream(String filePath, boolean append);
根据指定的文件路径,创建对应当前文件的文件操作字节输出流对象,append 用于控制当前文件内容写入采取的是
追加写(true)还是删除写(false)
FileOutputStream(File file, boolean append);
根据指定的文件 File 对象,创建对应当前文件的文件操作字节输出流对象,append 用于控制当前文件内容写入
采取的是追加写(true),删除写为(false)
写入操作相关方法
void write(int b);
写入一个字节数据到文件中
void write(byte[] buffer);
写入一个字节数组数据到文件中
void write(byte[] buffer, int offset, int length);
写入一个字节数组,从指定 offset 下标开始,计数字节个数 length 数据写入到文件中。
2.4.2 流程
// 1. 明确文件路径
String filePath = "D:/a/1.txt";
// 2. 打开字节输出流管道
FileOutputStream output = new FileOutputStream(filePath);
// 3. 字符串转 byte 类型数组
byte[] bytes = "数组".getBytes();
// 4. 写入数据到文件中
fos.write(bytes);
// 5. 关闭资源
fos.close();
2.5 文件操作字符输入流相关方法
FileReader 构造方法
FileReader(String filePath);
根据指定的文件路径,创建对应当前文件的文件操作字符输入流
FileReader(File file);
根据指定的文件 File 对象,创建对应当前文件的文件操作字符输入流对象
读取操作相关方法
int read();
从文件中读取一个字符数据返回,返回值类型为 int 类型,实际有效数据为 char
int read(char[] buffer); 【使用最多】
从文件中读取数据到 char 类型的缓冲数组中,返回值类型是本次读取操作存储到 char 缓冲数组中的字符个数
int read(char[] buffer, int offset, int length);
从文件中读取数据到 char 类型的缓冲数组中,要求从 offset 下标位置开始,到 length 计数结束,返回值是读取到数组中的字符个数
2.6 文件操作字符输出流相关方法
FileWriter 构造方法
FileWriter(String filePath);
根据指定的文件路径,创建对应当前文件的文件操作字符输出流对象
FileWriter(File file);
根据指定的文件 File 对象,创建对应当前文件的文件操作字符输出流对象
FileWriter(String filePath, boolean append);
根据指定的文件路径,创建对应当前文件的文件操作字符输出流对象,append 用于控制当前文件内容写入采取的是
追加写(true)还是删除写(false)
FileWriter(File file, boolean append);
根据指定的文件 File 对象,创建对应当前文件的文件操作字符输出流对象,append 用于控制当前文件内容写入
采取的是追加写(true),删除写为(false)
写入操作相关方法
void write(int ch);
写入一个字符数据到文件中
void write(char[] buffer);
写入一个字符数组数据到文件中
void write(char[] buffer, int offset, int length);
写入一个字符数组,从指定 offset 下标开始,计数字符个数 length 数据写入到文件中。
void write(String str);
写入一个字符串文件中
void write(String str, int offset, int length);
写入一个字符串,从指定 offset 下标开始,计数字符个数 length 数据写入到文件中。