1 File类概述和构造方法
-
File类介绍
- 它是文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象的
- 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
-
File类的构造方法
方法名 说明 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例 File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例 -
示例代码
public class FileDemo01 {
public static void main(String[] args) {
//File(String pathname): 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
File f1 = new File("E:\\wedu\\java.txt");
System.out.println(f1);
//File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的 File实例
File f2 = new File("E:\\wedu","java.txt");
System.out.println(f2);
//File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的 File实例
File f3 = new File("E:\\wedu");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
}
}
2 绝对路径和相对路径
- 绝对路径
是一个完整的路径,从盘符开始 - 相对路径
是一个简化的路径,相对当前项目下的路径 - 示例代码
public class FileDemo02 {
public static void main(String[] args) {
// 是一个完整的路径,从盘符开始
File file1 = new File("D:\\wedu\\a.txt");
// 是一个简化的路径,从当前项目根目录开始
File file2 = new File("a.txt");
File file3 = new File("模块名\\a.txt");
}
}
3 File类的创建功能
-
方法分类
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 -
示例代码
package com.svt.file;
import java.io.File;
import java.io.IOException;
public class FileCreateNew {
public static void main(String[] args) throws IOException {
//需求1:我要在E:\\svt目录下创建一个文件java.txt
File f1 = new File("E:\\svt\\java.txt");
System.out.println(f1.createNewFile());
System.out.println("--------");
//需求2:我要在E:\\svt目录下创建一个目录JavaSE
File f2 = new File("E:\\svt\\JavaSE");
System.out.println(f2.mkdir());
System.out.println("--------");
//需求3:我要在E:\\svt目录下创建一个多级目录JavaWEB\\HTML
File f3 = new File("E:\\svt\\JavaWEB\\HTML");
// System.out.println(f3.mkdir());
System.out.println(f3.mkdirs());
System.out.println("--------");
//需求4:我要在E:\\svt目录下创建一个文件javase.txt
File f4 = new File("E:\\svt\\javase.txt");
// System.out.println(f4.mkdir());
System.out.println(f4.createNewFile());
}
}
4 File类删除功能
-
方法分类
方法名 说明 public boolean delete() 删除由此抽象路径名表示的文件或目录 -
示例代码
package com.svt.file;
import java.io.File;
import java.io.IOException;
public class FileDelete {
public static void main(String[] args) throws IOException {
// File f1 = new File("E:\\svt\\java.txt");
//需求1:在当前模块目录下创建java.txt文件
File f1 = new File("myFile\\java.txt");
// System.out.println(f1.createNewFile());
//需求2:删除当前模块目录下的java.txt文件
System.out.println(f1.delete());
System.out.println("--------");
//需求3:在当前模块目录下创建svt目录
File f2 = new File("myFile\\svt");
// System.out.println(f2.mkdir());
//需求4:删除当前模块目录下的svt目录
System.out.println(f2.delete());
System.out.println("--------");
//需求5:在当前模块下创建一个目录svt,然后在该目录下创建一个文件java.txt
File f3 = new File("myFile\\svt");
// System.out.println(f3.mkdir());
File f4 = new File("myFile\\svt\\java.txt");
// System.out.println(f4.createNewFile());
//需求6:删除当前模块下的目录svt
System.out.println(f4.delete());
System.out.println(f3.delete());
}
}
5 File类判断和获取功能
-
判断功能
方法名 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为目录 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在 -
获取功能
方法名 说明 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或目录的名称 public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组 -
示例代码
package com.svt.file;
import java.io.File;
public class FileIsOrNo {
public static void main(String[] args) {
//创建一个File对象
File f = new File("myFile\\java.txt");
// public boolean isDirectory():测试此抽象路径名表示的File是否为目录
// public boolean isFile():测试此抽象路径名表示的File是否为文件
// public boolean exists():测试此抽象路径名表示的File是否存在
System.out.println(f.isDirectory());
System.out.println(f.isFile());
System.out.println(f.exists());
// public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
// public String getPath():将此抽象路径名转换为路径名字符串
// public String getName():返回由此抽象路径名表示的文件或目录的名称
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
System.out.println(f.getName());
System.out.println("--------");
// public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
File f2 = new File("E:\\wedu");
File[] fileArray = f2.listFiles();
for(File file : fileArray) {
// System.out.println(file);
// System.out.println(file.getName());
if(file.isFile()) {
System.out.println(file.getName());
}
}
}
}
6 File类练习应用案例一
- 案例需求
使用递归计算1-n的和 - 代码实现
package com.svt.file;
public class fileDemo02 {
//使用递归计算1-n的和
public static void main(String[] args) {
int i = sum(3 );
System.out.println(i);
}
/**
* 定义一个方法,使用递归计算1-n的和
* 1+2+3+……+n
* 最大值n
* 最小值1
* 结束条件-获取到1的时候结束
* 目的-获取下一个被加的数字(n-1)
*
*/
public static int sum(int n){
//获取到1的时候结束
if (n==1){
return 1;
}
//获取下一个被加的数字(n-1)
return n+sum(n-1);
}
}
7 File类练习应用案例二
- 案例需求
使用递归计算阶乘
n的阶乘:n!=n*(n-1)…321
5的阶乘:5*(5-1)(5-2)(5-3)*(5-4)
获取到1结束
获取到下一个被乘的数字(n-1) - 代码实现
package com.svt.file;
public class fileDemo03 {
/**
* 使用递归计算阶乘
* n的阶乘:n!=n*(n-1)*...*3*2*1
* 5的阶乘:5*(5-1)*(5-2)*(5-3)*(5-4)
* 获取到1结束
* 获取到下一个被乘的数字(n-1)
* @param args
*/
public static void main(String[] args) {
int re=mult(5);
System.out.println(re);
}
//定义方法使用递归计算阶乘
public static int mult(int n){
//终止条件
if (n==1){
return 1;
}
return n*mult(n-1);
}
}
8 File类练习应用案例三
- 案例需求
打印文件夹以及文件夹内文件 - 代码实现
package com.svt.file;
import java.io.File;
public class fileDemo04 {
public static void main(String[] args) {
File file = new File("F:\\DELL\\dellStudy\\06-IO流\\02-学习资料\\学习笔记");
getAllFile(file);
}
//递归定义一个方法
public static void getAllFile(File dir){
//打印被遍历的目录名称
System.out.println(dir);
File[] files = dir.listFiles();
for (File file : files) {
//对遍历得到的对象file进行判断,判断是否是文件夹
if (file.isDirectory()){
//f是一个文件夹,则继续遍历这个文件夹
//直接调用getAllFile方法递归自己
getAllFile(file);
}else
System.out.println(file);
//file是一个文件,直接打印即可
}
}
}
9 FileFilter过滤器
- 文件过滤器进行优化
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器- File[] listFiles(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法 - boolean accept(File pathname)
测试指定路径对象名是否应该包含在某个路径名列表中。
参数:File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
- File[] listFiles(FileFilter filter)
- 用于抽象路径名的过滤器
- File[] listFiles(FilenameFilter filter
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名。
作用:用于过滤文件名称轴
抽象方法:用来过滤文件的方法 - boolean accept(File dir,string name) 测试指定文件是否应该包含在某一文件列表中。
参数:
File dir:构造方法中传递的被遍历的目录
string name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意:两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
- File[] listFiles(FilenameFilter filter
- 代码示例
接口类
package com.svt.file.fileDemo06;
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()){
return true;
}
/**
* 过滤的规则:在accept方法中,判断File对象是否是以.md结尾
* 是就返回true不是就返回false
*/
return pathname.getName().toLowerCase().endsWith(".md");
}
/**
* 创建过滤器实现类
* 重写过滤方法accept
* 定义过滤规则
*
*/
}
测试类
package com.svt.file.fileDemo06;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class fileDemo07 {
public static void main(String[] args) {
File file = new File("F:\\DELL\\dellStudy\\06-IO流\\02-学习资料\\学习笔记");
getAllFile(file);
}
//递归定义一个方法
public static void getAllFile(File dir){
//打印被遍历的目录名称
//System.out.println(dir);
//传递过滤器对象 使用匿名内部类
/*File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//过滤规则 pathname是文件夹或者是.md结尾的文件返回true
return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".md");
}
});*/
//File[] files = dir.listFiles(pathname->pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".md"));
/*File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//过滤规则 pathname是文件夹或者是.md结尾的文件返回true
return new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".md");
}
});*/
//lambda表达式 因为只有一个accept抽象方法
File[] files = dir.listFiles(( d, name)->new File(d,name).isDirectory()||name.toLowerCase().endsWith(".md"));
for (File file : files) {
//对遍历得到的对象file进行判断,判断是否是文件夹
if (file.isDirectory()){
//f是一个文件夹,则继续遍历这个文件夹
//直接调用getAllFile方法递归自己
getAllFile(file);
}else
System.out.println(file);
//file是一个文件,直接打印即可
}
}
}