一、概述
- 定义:是文件和目录路径名的抽象表示
- 人话:表示的是计算机中的某个文件对象
- 抽象指的是,File对象代表的并不是真实的文件,而是使用面向对象的思想,创建了传入路径的文件对象,提供了相关的API用于操控该文件对象
- 文件操作一定要慎重,因为删除了并不会放到回收站,不见了就是不见了
二、部分构造方法解析
- 下面的构造方法在后面常用API解析时会有详细的举例
File(String pathname)
- 入参的是文件的路径名,表示的是一个文件对象
- 表示的可以是文件夹,也可以是一个普通文件
- 例如:"I:"、"I:\\haha"、"I:\\a\\b"、"I:\\a.txt"
File(File parent, String child)
- 第一个参数也是File对象,表示的是父文件夹
- 第二个参数代表的是当前File对象代表的文件名
- 可以是文件夹,也可以是普通文件
- 第二个参数通常创建在父目录(第一个参数)下
File(String parent, String child)
- 和File(File parent, String child)相同,只不过第一个参数是字符串,表示的是父文件夹的路径
三、常用API解析
boolean createNewFile()
- 创建普通文件
- 注意创建的不是文件夹
- 通常需要指定文件的后缀,否则创建出来的文件没有意义
- 如果文件已经存在,返回false;文件不存在则创建文件,并返回true
- 传入路径包含的文件夹必须存在,如果不存在则抛出异常
- 举例
public static void main(String[] args) throws IOException {
//a文件夹不存在,下面的代码会报错
/* File file = new File("I:\\a\\a.txt");
file.createNewFile();*/
//在I盘下创建a.txt文件
File file1 = new File("I:\\a.txt");
file1.createNewFile();
}
boolean mkdir()
- 创建文件夹
- 创建文件夹的名字,是传入路径的最后一个"\\"后面的字符串
- 如果路径下有不存在的文件夹,该方法会报错
- 如果需要创建的文件夹已经存在,返回false;如果需要创建的文件夹不存在,创建该文件夹并返回true
- 举例
public static void main(String[] args) throws IOException {
File file = new File("I:\\a\\b");
//相当于创建b文件夹,前提是a文件夹要存在,否则运行时不报错,但是无法创建
System.out.println(file.mkdir());
File file2 = new File("I:\\a");
//成功创建a文件夹
System.out.println(file2.mkdir());
}
boolean mkdirs()
- 创建文件夹,同mkdir()方法,但有一点区别
- 如果路径下存在未创建的文件夹,该方法会连带这些文件夹一同创建
- 举例
public static void main(String[] args) throws IOException {
File file = new File("I:\\a\\b");
//a不存在时创建a,然后创建b
file.mkdirs();
File file2 = new File("I:\\c");
//可以直接创建c
file2.mkdirs();
}
boolean delete()
- 删除传入路径表示的文件或目录
- 举例
- 删除下图位置的666.txt文件
public static void main(String[] args) throws IOException {
File file = new File("I:\\a\\aa\\666.txt");
file.delete();
}
- 再把aa文件夹也删了
public static void main(String[] args) throws IOException {
File file = new File("I:\\a\\aa");
file.delete();
}
String getName()
- 获取文件夹或文件名称
- 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取该文件的名字
String name = file.getName();
System.out.println(name); //a.txt
String getParent()
- 获取父文件夹的名称
- 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取该文件的父文件名称
String name = file.getParent();
System.out.println(name); //I:\
File getParentFile()
- 获取父文件夹的对象
- 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取该文件的父文件对象
File parentFile = file.getParentFile();
System.out.println(parentFile); //I:\
String getPath()
- 将传入的路径转换为路径名字符串
- 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//将文件路径名变为字符串
String path = file.getPath();
System.out.println(path); //I:\a.txt
long length()
- 获取文件的长度
- 单位是字节
- 1KB = 1024字节
- 1MB = 1024KB
- 1GB = 1024MB
- 单位是字节
- 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取a.txt文件长度
long length = file.length();
System.out.println(length); //0,因为还没编辑任何内容
boolean exists()
- 判断传入路径表示的文件或目录是否存在
- 举例
File file = new File("I:\\a.txt");
//判断a.txt文件是否存在
boolean exists = file.exists();
if (!exists){
System.out.println("文件不存在,即将创建文件");
//创建a.txt文件
file.createNewFile();
}else{
System.out.println("文件存在");
}
boolean isDirectory()
- 判断传入的路径是否代表一个文件夹
- 如果路径代表的文件不存在,或者文件存在但不是文件夹,返回false
- 文件存在且是文件夹,返回true
- 举例
File file = new File("I:\\a.txt");
//a.txt文档不是一个文件夹
System.out.println(file.isDirectory()); //false
File file1 = new File("I:\\haha");
//第一次运行,未创建haha文件夹,返回false;
//第二次运行,第一次已经创建了haha文件夹,返回true
System.out.println(file1.isDirectory());
file1.mkdir();
boolean isFile()
- 判断传入路径代表的是不是一个普通文件
- 举例
File file = new File("I:\\a.txt");
//第一次运行时未创建a.txt,返回false;
//第二次运行时a.txt存在且是一个普通文件,返回true
System.out.println(file.isFile()); //false
file.createNewFile();
File file1 = new File("I:\\haha");
file1.mkdir();
//haha文件夹不是一个普通文件,返回false
System.out.println(file1.isFile());
File[] listFiles()
- 获取文件夹里所有的文件对象,返回一个File对象数组
- 该路径下没有其他文件,返回null
- 如果有隐藏文件,也会包含在数组中
- 举例
File file = new File("I:");
//查找I盘下的所有文件
File[] files = file.listFiles();
//[I:!金山毒霸免疫勒索病毒 勿删除, I:$RECYCLE.BIN, I:a, I:a.txt, I:b, I:haha, I:System Volume Information]
System.out.println(Arrays.toString(files));
File file2 = new File("I:\\a");
//查找a文件下的所有文件
File[] files2 = file2.listFiles();
System.out.println(Arrays.toString(files2)); //[I:\a\aaa, I:\a\bbb]
String[] list()
- 同listFiles()方法,区别在于返回的是字符串数组
- 举例
File file = new File("I:");
//查找I盘下的所有文件
String[] files = file.list();
//[I:!金山毒霸免疫勒索病毒 勿删除, I:$RECYCLE.BIN, I:a, I:a.txt, I:b, I:haha, I:System Volume Information]
System.out.println(Arrays.toString(files));
File file2 = new File("I:\\a");
//查找a文件下的所有文件
String[] files2 = file2.list();
System.out.println(Arrays.toString(files2)); //[I:\a\aaa, I:\a\bbb]
boolean renameTo(File dest)
- 重命名此抽象路径表示的文件
- 人话
- 就是一个剪切文件+重命名操作
- 将调用者代表的文件,剪切到被调用者的路径下,并以被调用者路径的最后一段进行重命名操作
- 看一下例子就明白
- 举例
- 原来的文件目录结构
- I盘里有a文件夹、b文件夹
- a文件夹为空
- b文件夹下有一个bb文件夹、一个bb.txt文件
- bb文件夹下有个666.txt文件
- 执行代码
File file1 = new File("I:\\a\\aa");
File file2 = new File("I:\\a\\aa.txt");
//b文件夹下的bb文件夹(需要被转移的文件)
File file3 = new File("I:\\b\\bb");
//b文件夹下的bb.txt文件(需要被转移的文件)
File file4 = new File("I:\\b\\bb.txt");
//将bb文件夹转移到a文件夹,并重命名为aa文件夹(原bb文件夹下的东西还存在)
file3.renameTo(file1);
//将bb.txt转移到a文件夹下,重命名为aa.txt
file4.renameTo(file2);
- 执行上面代码后的目录结构
- a文件夹下多了一个aa文件夹(原来的bb文件夹)、aa.txt文件(原来的bb.txt文件)
- aa文件夹下有一个666.txt文件(原来bb文件夹下的666.txt文件)
- b文件夹下的所有文件没了
四、File的常量字段
- File类提供了四个常量字段,用于表示系统相关的路径分隔符或系统相关的名称分隔符
- 定义这些常量的目的
- 不同操作系统对于文件路径的路径分隔符、名称分隔符可能不同。java具有跨平台性,如果写死这些符号,在不同的操作系统不一定能运行,因此引入了这些常量
- 分隔符的区别如下表所示
操作系统名称 | Windows | Linux |
名称分隔符 | \ | / |
路径分隔符 | ; | : |
- 举例
//与系统相关的路径分隔符
System.out.println(File.pathSeparator); //;
//与系统相关的默认名称分隔符
System.out.println(File.separator); //\
五、File的应用举例
- 需求
- 需要查找指定路径下的所有png格式照片,且大小大于20KB
- 思路
- 使用listFiles()方法获取该路径下的所有文件对象
- 自定义方法遍历数组的所有文件
- 如果文件是文件夹
- 使用listFiles()方法获取该文件夹下的所有文件对象
- 递归调用自定义方法进行遍历
- 如果文件是普通文件
- 使用getName()方法获取文件名字,判断后缀是否以png结尾
- 判断大小是否大于20*1024(1KB = 1024B)
- 满足条件,打印路径和文件信息
- 判断大小是否大于20*1024(1KB = 1024B)
- 使用getName()方法获取文件名字,判断后缀是否以png结尾
- 如果文件是文件夹
- 代码
package File;
import java.io.File;
/**
* 查找指定路径下大于20KB的png文件
*/
public class demo2 {
public static void main(String[] args) {
File file = new File("I:\\mypicture");
//获取该文件下的所有文件对象
File[] files = file.listFiles();
//调用自定义方法
filesList(files);
}
public static void filesList(File[] files){
//传入的文件集合不能为空,长度必须大于0
if (files!=null && files.length>0){
int count = 1;
for (File file : files) {
count++;
if (file.isFile()){
//是文件
//判断文件是否以jpg结尾
if (file.getName().endsWith(".png")){
//如果文件大于20KB
if (file.length()>20*1024){
//输出图片名称+文件路径
System.out.println("文件名:"+file.getName()+" ,文件大小:"+file.length()/1024
+"KB ,文件路径:"+file.getAbsolutePath());
}
}
}else{
//是文件夹
//获取该文件夹下的所有文件集合
File[] files1 = file.listFiles();
//递归调用自定义方法
filesList(files1);
}
}
}
}
}
- 运行效果
六、绝对路径和相对路径
- 绝对路径
- 从盘符开始,编写的是一个完整的路径
- 不论什么时候,该路径永远只代表这一个固定位置的文件
- 例如: c://a.txt
- 相对路径
- 没有盘符,仅仅写的是某个文件的名称
- 在java代码中是相对于项目目录路径,这是一个不完整的便捷路径,在java开发中很常用
- 例如: a.txt
- 打印出来的路径:项目路径名+a.txt
- 代码举例
public static void main(String[] args) {
File f1 = new File("I:\\a.txt");
File f2 = new File("a.txt");
//I:\a.txt 绝对路径
System.out.println(f1.getAbsolutePath());
//H:\KKB_IDEA\project1102\a.txt 相对路径
System.out.println(f2.getAbsolutePath());
}