一、File类概述
包位置:java.io.File:
File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、删除、获取、判断、遍历、获取大小;File类是一个与操作系统无关的一个类
1.File类操作系统相关分割符静态成员变量:(省略static)
-
String pathSeparator: 操作系统相关路径分隔符,字符串表示【windows:分号; linux:冒号:】 -
char pathSeparatorChar: 操作系统有关的路径分隔符,字符表示 -
String separator:与系统有关的默认分隔符,字符串表示。【文件名称分隔符 windows:反斜杠\ linux:正斜杠/】 -
char separatorChar: 系统相关的默认名称分隔符,字符表示
/*
操作路径:路径不能写死了
C:\develop\a\a.txt windows
C:/develop/a/a.txt linux
"C:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt"
*/
System.out.println(File.pathSeparator);//路径分隔符 windows:分号; linux:冒号:
System.out.println(File.separator);// 文件名称分隔符 windows:反斜杠\ linux:正斜杠/
2.绝对路径与相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的根路径,这是一个便捷的路径,开发中经常使用。(
C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt-->简化为:123.txt(可以省略项目的根目录))
注意:
- windows操作系统中路径是不区分大小写
- 路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
\\
二、构造方法
构造方法:(省略public)
-
File(String pathname): 路径名字符串 --> 抽象路径 --> new File 实例 -
File(String parent, String child): 父路径名字符串+子路径名字符串 --> new File 实例 -
File(File parent, String child):父抽象路径名+子路径名字符串 --> new File 实例
/** 绝对路径与相对路径参数:
String pathname:字符串的路径名称
1.路径可以是以文件结尾,也可以是以文件夹结尾
2.路径可以是相对路径,也可以是绝对路径
3.路径可以是存在,也可以是不存在
4.创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况*/
/*绝对路径*/
String pathname1 = "G:\\picture\\feifei.jpg";
File file1 = new File(pathname1);
/*相对路径*/
String parthname2 = ".\\moduleName\\fiefei.jpg";
File file2 = new File(parthname2);
- 父路径和子路径拼接
/**@父路径和子路径拼接
好处:
父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化*/
String parent3 = "G:\\picture";
String child3 = "feifei.jpg";
File file3 = new File(parent3, child3);
- 父级File对象(文件夹路径) + 总路径字符串
/** @父级File对象(文件夹路径) + 总路径字符串
好处:
1.父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化
2.父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象*/
File parentDir4 = new File("G:\\picture");
String child4 = "feifei.jpg";
File file4 = new File(parentDir4, child4);
1.一个File对象代表硬盘中实际村子的一个文件或者目录
2.无论该路径下时候存在文件或者目录,都不影响File对象的创建。
三、常用功能
1.一般功能(省略public)
-
String getAbsolutePath(): 返回此File的绝对路径名 字符串。- 返回盘符到文件后缀名或者末文夹件名之间的字符串
-
String getPath(): 返回此File转换为路径名的字符串- 返回构造路径,
new File对象时传入的参数形式(相对或者绝对) -
toString方法调用的就是getPath方法
- 返回构造路径,
-
String getName():返回由此File表示的文件或者目录的名称。- 获取的就是构造方法传递路径的结尾部分(文件/文件夹)
-
String long length():返回由此File表示的文件的长度。- 获取的是构造方法指定的文件的大小,以字节为单位
- 文件夹是没有大小概念的,不能获取文件夹的大小
- 如果构造方法中给出的路径不存在,那么length方法返回0
-
String getParent():得到父路径!
2.判断功能的方法(省略public)
-
boolean exists(): 返回此File表示的文件或者目录是否实际存在 -
boolean isDirectory(): 判断此File表示的是否为目录(文件夹结尾) -
boolean isFile(): 判断此File是否为文件(文件结尾)。1.电脑的硬盘中只有文件/文件夹,两个方法是互斥
2.这两个方法使用前提,路径必须是存在的,否则都返回false
3.创建删除功能方法(省略public)
-
boolean createNewFile: 当且仅当该名称的文件尚不存在时,创建一个新的空文件(构造方法的参数)【创建文件的路径必须存在】。(操作文件夹无效)返回值:布尔值
true:文件不存在,创建文件,返回true
false:文件存在,不会创建,返回false注意:创建文件的路径必须存在,否则会抛出异常,而且必须处理IOException异常
public boolean createNewFile() throws IOException
createNewFile声明抛出了IOException,我们调用这个方法,就必须的处理这个异常,要么throws,要么trycatch -
boolean delete(): 删除由此File表示的文件或者目录如果此File表示目录,则目录必须为空才能删除。
- >删除构造方法路径中给出的文件/文件夹【末尾文件或者末尾文件夹】
- >布尔值
true:文件/文件夹删除成功
false:文件夹中有内容,不会删除
构造方法中路径不存在
- >注意:delete方法是直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎
boolean mkdir(): 创建由此File表示的目录。(操作文件无效)-
boolean mkdirs():【推荐使用】创建由此File表示的目录,包括任何必须但是不存在的父目录。返回值:布尔值
true:文件夹不存在,创建文件夹
false:文件夹存在,不会创建;
构造方法中给出的路径不存在
- >注意:此方法只能创建出文件夹,不能创建文件
4.目录(目录对象)的遍历(省略public)
-
String[] list(): 返回String数组,该File目录下的所有子文件或目录。 -
File[] listFiles(): 返回一个File数组,该File目录下的所有的子文件或目录调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
- >注意:
1.如果构造方法中给出的目录的路径不存在,会抛出空指针异常
2.如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
返回相关目录下文件夹或文件的数组
File file = new File("day_08");
String[] fileSon = file.list();
System.out.println(Arrays.toString(fileSon));
// [day_08.iml, feifei.jpg, src]
5.文件过滤器优化【有文件夹则递归寻找】【配合使用->dir.listFiles(lambda)】
-
java.io.FileFilter是一个File过滤器。该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口中只有一个方法-
boolean accept(File pathname):测试pathname是包含在当前File目录中,符合则返回true
-
// 创建一个dir文件
File dir = new File(".\\day_08");
// 使用匿名函数的方式
File[] array = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getName().endsWith(".java");
}
});
// 使用lambda的方式
File[] array2 = dir.listFiles(
pathname -> pathname.isDirectory()
|| pathname.getName().endsWith(".java"));
6.文件过滤器优化【非递归寻找】【配合使用->dir.listFiles(lambda)】
-
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名。 -
boolean accept(File dir, String name)测试指定文件是否应该包含在某一文件列表中。-
File dir:构造方法中传递的被遍历的目录【文件所在目录文件,不含末尾文件/文件名】 -
String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
-
File[] array = new File(".\\learnSelf").listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
System.out.println(dir); // .\\learnSelf
return name.toLowerCase().endsWith("java");
}
});
for (File file : array) {
System.out.println(file.getName());
}
综合案例 递归访问一个文件夹下面所有的文件夹或者文件(有color)
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File(".");
System.out.println(file.getName());
showFile(file, 0, "");
}
public static boolean showFile(File file, int depth, String fatherSpace) {
// 记录当前递归是否打印了前置空白,从而显示得不太宽松
boolean printed = false;
// 递归打印当前文件夹下的文件和文件夹
File[] filesList = file.listFiles();
File file1;
String current = "";
for (int i = 0; i < filesList.length; i ++) {
file1 = filesList[i];
System.out.print(fatherSpace + " |");
// 计算下一个递归需要的前置空白
if(i == filesList.length - 1) {
current = fatherSpace + " ";
} else {
current = fatherSpace + " |";
}
if(file1.isDirectory()) {
// 打印当前的文件夹名称
System.out.println("\033[34;1m-[D]\033[0m" + "\033[36;2m" + file1.getName() + "\033[0m");
// 递归遍历此文件夹
printed = showFile(file1, depth + 1, current);
} else {
System.out.println("\033[31;1m-[F]\033[0m" + "\033[35;2m" + file1.getName() + "\033[0m");
}
// 当前列表结束打印一个父级空白,从而显得不拥挤
if(i == filesList.length - 1 && !printed) {
System.out.println(fatherSpace);
return true;
}
}
return printed;
}
}