关键字:File类的创建、删除;获取文件名、路径、大小;目录遍历、文件查找
Content
一、File类入门
1.概念
2.提供的静态方法(了解)
- C:\develop\a.txt windows 反斜杠
- User/develop/a.txt linux 正斜杆
类名.静态成员
| static String pathSeparator | 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
| static char pathSeparatorChar | 与系统有关的路径分隔符。 |
| static String separator | 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符 |
| static char separatorChar | 与系统有关的默认名称分隔符。 |
package file;
import java.io.File;
/**
* File的静态成员变量
* 功能:关于文件路径和文件名称的分隔符使用
*/
public class Demo01File {
/**
* 注意:操作路径不能写死了
* C:\develop\a.txt windows 反斜杠
* User/develop/a.txt linux 正斜杆
* 正确写法:"C:" + File.separator + "develop" +File.separator+ "a.txt" ;
*/
public static void main(String[] args) {
String pathSeparator = File.pathSeparator; //路径分隔符 win是 分号;
System.out.println(pathSeparator); // linux 为 冒号:
String separator = File.separator; //文件名称分隔符 win:反斜杠 \
System.out.println(separator); //linux :正斜杠 /
}
}
3.构造方法
4 中创建 File 对象的方法;
- File(String pathname);
- File(String parent,String child);
- File(File parent , String child);
- File(URI uri);
public class Demo02FileStructure {
public static void main(String[] args) {
String pathname = "/Users/IdeaProjects/JavaDemo/a.txt"; //传递文件夹、或者文件全称
File file = new File(pathname);
System.out.println(file);
File a = new File("a.txt"); // 传递文件名!!!不要带斜杆
System.out.println(a);
}
}
4.常用的三大方法(重点)
一、获取功能
-
获取绝对路径:file.getAbsolutePath() -
获取路径:file.getPath() 构造函数中的路径值 -
获取文件名:file.getName() -
获取文件大小:file.length() 单位:字节
二、判断功能:
-
file 文件/夹是否存在:file.exists() -
构造函数路径是尾部是文件吗:file.isFile() -
file.isDirectory()
三、创建、删除功能
-
创建新文件:file.createNewFile() -
创建单级目录:file.mkdir() -
创建多级目录:file.mkdirs() 一般使用这个,兼容单级。 -
删除文件/空文件夹:file.delete() 直接从磁盘删除,不走回收站
package file;
import java.io.File;
import java.io.IOException;
/*
* File 三大类常用的方法:File file = new File("文件名/文件夹"
* time:2020-05-07
* */
public class Demo03FileMethod {
public static void main(String[] args) throws IOException {
//获取文件:路径、名称、大小的4种方法
//show1();
//判断的方法:File是否存在、是否为文件或者目录
//show2();
//创建、删除:文件、目录功能
show3();
}
/*
* 种类3:创建和删除功能
* */
private static void show3() throws IOException {
//此file只是文件或者路径的 抽象表现形式,此时是不存在的。
File file = new File("/Users/IdeaProjects/JavaDemo/b.txt");
//1. createNewFile():
// 创建文件
boolean newFile = file.createNewFile(); //抛出异常
System.out.println("绝对路径文件创建:" + newFile);
boolean c = new File("c.txt").createNewFile(); // 注意此时,只需要传递文件名即可。不用加斜杠
System.out.println("相对路径文件创建:"+ c);
//2.创建文件夹:
// mkdir() 创建单级文件夹
// mkdird() 创建多级文件夹
File f1 = new File("/Users/IdeaProjects/JavaDemo/新建文件夹");
System.out.println(f1.mkdir());
boolean mkdirs = new File("/Users/IdeaProjects/JavaDemo/新建文件夹/aaa/bbb").mkdirs();
System.out.println(mkdirs);
//3. file.delete()
// 删除空文件夹,或者文件
File f2 = new File("/Users/IdeaProjects/JavaDemo/新建文件夹/ccc");
System.out.println("删除新建文件夹下的CCC文件夹:"+f2.delete());
//删除已存在的文件
File d = new File("c.txt");
System.out.println("删除d.txt:"+d.delete());
}
/*
* 种类2:判断功能的方法
* */
private static void show2() {
File file = new File("/Users/IdeaProjects/JavaDemo/a.txt");
//1. exists()
boolean b = file.exists();
System.out.println("文件或者目录是否真实存在:" + b);
//2. isFile()
boolean isfile = file.isFile(); //判断此 File是否为文件,即 new File()中传递的路径 结尾是否是文件名
System.out.println(isfile);
//3.isDirectory
System.out.println(file.isDirectory()); //判断是此File是否为文件夹,即判断构造方法中给定的路径,结尾处是否是文件夹
}
/*
* 种类1:获取方法
* */
private static void show1() {
//创建文件或目录抽象对象,重写了toString方法
File file = new File("/Users/IdeaProjects/JavaDemo/a.txt");
System.out.println(file); //toString()方法,调用的就是getPath()方法
//1.getAbsolutePath() 获取绝对路径:
System.out.println(file.getAbsolutePath());// /Users/IdeaProjects/JavaDemo/a.txt
//2.getPath() :获取路径
System.out.println(file.getPath()); // 和new File()时传递的路径有关系
//3.getName() :获取的是构造方法传递路径的结尾部分,即最后一级文件夹或者文件名
String name = file.getName();
System.out.println(name); //JavaDemo或者a.txt
//4. length() :获取文件大小(单位:字节)
long length = file.length(); //588 byte
System.out.println(length); //无法获取 文件夹(文件夹没有大小之分) 以及 不存在的的文件的大小
}
}
二、遍历目录、递归、文件查找
1.遍历目录
File类提供的遍历下一级目录Directory的方法:
- (1)public String[]
list(); 返回String数组,表示File目录中的下一级的所有文件和目录名 - (2) public File[]
listFiles();返回File数组,表示File下级目录中的所有文件和文件夹的 new File() 抽象对象表示形式
public class Demo04FileDirectoryEach {
public static void main(String[] args) throws IOException {
//创建文件和文件夹
new File("/Users/IdeaProjects/JavaDemo/test/ccc/ddd").mkdirs();
new File("/Users/IdeaProjects/JavaDemo/test/ccc/eee").mkdirs();
new File("/Users/IdeaProjects/JavaDemo/test/ccc/a.txt").createNewFile();
//遍历目录1: file.list()
File file = new File("/Users/IdeaProjects/JavaDemo/test/ccc");
String[] list = file.list();
for (String s : list) {
System.out.println(s);
//打印目录下子内容名称
}
//遍历目录2: file.listFiles()
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1);
/* 打印该目录下的子内容,以File的重写的toString()
}
}
}
想要遍历某文件夹下的各级子内容,得使用递归思想+上述方法!
3.递归思想
递归思想:递归计算 n+…+1 之和
1.中止条件2.递归目的:获取下一个数字
public class Demo01Recurison {
public static void main(String[] args) {
int sum = sum(100);
System.out.println(sum);
}
private static int sum(int n) {
//System.out.println(n);
if (n == 1)
return 1; //1.中止条件
//2.递归的目的:获取下一个被加的 数字(n-1)
return n + sum(n-1);
}
}
3.利用递归对文件遍历和搜索🔍
- 功能:搜索本项目下的所有
.java文件:递归和字符串尾缀匹配的方法来找 .java 文件
public class Demo02DirectoryRecurison {
//递归打印 多级目录
//同时也可以递归搜索 特定文件
public static void main(String[] args) {
File dir = new File("/Users/IdeaProjects/JavaDemo");
getAllFiles(dir);
}
private static void getAllFiles(File dir) {
// System.out.println(dir); //打印所有文件夹
File[] files = dir.listFiles(); //用到listFiles()方法,查看下一级内容
for (File f : files) {
if (f.isDirectory()){ //判断是否为文件夹,是则递归查看
getAllFiles(f);
}else {
//System.out.println(f); //打印所有文件名
/*
//法一:搜索 .java结尾的文件
String name = f.getName();
int i = name.lastIndexOf(".");
String substring = name.substring(i + 1);
if (substring.equals("java")){
System.out.println(f);
}*/
//法二:搜索 .java文件
// 还有 name.endsWith(".java") 方法来判断尾缀。
if (f.getName().toLowerCase().endsWith(".java")){
System.out.println(f); //兼容大小写,
}
}
}
}
}
4.优化文件搜索🔍
优化1:上面的 dir.listFiles() 将文件夹下的所有内容均存储到了 File[] 数组中,造成了栈空间的浪费。这里采用File类中listFiles()的两种重载方法,来进行文件过滤。满足过滤器的存入File数组
listFiles(FileFilter filter)
listFiles(FilenameFilter filter)
public class Demo03FileSearch {
//1.上面用递归和字符串尾缀匹配的方法来找 .java 文件
//2. 这里采用File类中listFiles()的两种重载方法,来进行文件过滤。
//3.listFiles(FileFilter filter) listFiles(FilenameFilter filter)
//4.FileFilter是一个接口,只有accept一个抽象方法,因为可使用lambda表达式优化匿名内部类
public static void main(String[] args) {
File dir = new File("/Users/IdeaProjects/JavaDemo");
getAllFiles(dir);
}
private static void getAllFiles(File dir) {
// System.out.println(dir); //打印所有文件夹
//用到listFiles()方法,查看下一级内容
//这里使用带有过滤器的listFiles(filter)方法,符合过滤器规则的,返回true,则保存到File[]数组中
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().toLowerCase().endsWith(".java") || pathname.isDirectory()){
return true;
}
return false;
}
});
for (File f : files) {
if (f.isDirectory()){ //判断是否为文件夹,是则递归查看
getAllFiles(f);
}else {
//搜索 .java文件
if (f.getName().toLowerCase().endsWith(".java")){
System.out.println(f); //兼容大小写,
}
}
}
}
}
优化2:使用lambda表达式优化匿名内部类(接口只有一个抽象函数的情况下) :
()->{} 只保留参数和方法体
File[] files = dir.listFiles((pathname)->{
return pathname.getName().toLowerCase().endsWith(".java") || pathname.isDirectory();
});
本文主要介绍了Java中的File类,包括概念、静态方法、构造方法及常用的三大方法。重点讲解了如何遍历目录、实现递归以及优化文件查找,特别是通过递归和字符串尾缀匹配搜索.java文件的方法。
9707

被折叠的 条评论
为什么被折叠?



