java.io.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:\\测试文件\\java.txt");
System.out.println(f1);
//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的File实例。
File f2=new File("E:\\测试文件","java.txt");
System.out.println(f2);
//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的File实例。
File f3=new File("E:\\测试文件");
File f4=new File(f3,"java.txt");
System.out.println(f4);
}
}
File类创建删除功能的方法
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 |
public boolean mkdir() | 创建由此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 |
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
示例代码:
public class FileDemo02 {
public static void main(String[] args) throws IOException {
//需求1:我要在E:\\测试文件目录下创建一个文件java.txt
File f1=new File("E:\\测试文件\\java.txt");
System.out.println(f1.createNewFile());
System.out.println("---------");
//需求2:我要在E:\\测试文件目录下创建一个目录JavaSE
File f2=new File("E:\\测试文件\\javase");
System.out.println(f2.mkdir());
//需求3:我要在E:\\测试文件目录下创建一个多级目录JavaWEB\\HTML
File f3=new File("E:\\测试文件\\Javaweb\\HTML");
System.out.println(f3.mkdirs());
//文件的删除
System.out.println(f1.delete());
//目录的删除
System.out.println(f2.delete());
System.out.println(f3.delete());
}
}
File类判断和获取功能
- 判断功能
方法名 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
public class FileDemo03 {
public static void main(String[] args) throws IOException {
File f1=new File("E:\\测试文件\\java.txt");
System.out.println(f1.isDirectory());
System.out.println(f1.isFile());
System.out.println(f1.isAbsolute());
System.out.println("---------");
File f2=new File("E://测试文件");
System.out.println(f2.isDirectory());
System.out.println(f2.isFile());
System.out.println(f2.isAbsolute());
}
}
- 获取功能
方法名 | 说明 |
---|---|
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
public long length() | 返回由此File表示的文件的长度 |
public String[] list() | 返回一个String数组,表示该File目录中的所有子文件或目录 |
public File[] listFiles() | 返回一个File数组,表示该File目录中的所有的子文件或目录 |
public class FileDemo04 {
public static void main(String[] args) throws IOException {
File f1=new File("E:\\测试文件\\java.txt");
System.out.println("文件绝对路径:"+f1.getAbsoluteFile());
System.out.println("文件构造路径:"+f1.getPath());
System.out.println("文件名称:"+f1.getName());
System.out.println("文件长度:"+f1.length()+"字节");
System.out.println("---------");
File f2=new File("E://测试文件");
System.out.println("目录绝对路径:"+f2.getAbsolutePath());
System.out.println("目录构造路径:"+f2.getPath());
System.out.println("目录名称:"+f2.getName());
System.out.println("目录长度:"+f2.length());
System.out.println("-----------");
String[] strArray = f2.list();
for (String str:strArray){
System.out.println(str);
}
System.out.println("-----------");
File[] fileArray = f2.listFiles();
for (File file:fileArray){
if (file.isFile()){
System.out.println(file.getName());
}
}
}
}
递归
递归:指在当前方法内调用自己的这种现象。
分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
public class Demo01DiGui {
public static void main(String[] args) {
a();
}
/*
* 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"
* java.lang.StackOverflowError
*/
private static void a() {
System.out.println("a方法");
a();
}
}
内存分析
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
-
构造方法,禁止递归
-
递归累加求和
分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num = 5;
// 调用求和的方法
int sum = getSum(num);
// 输出结果
System.out.println(sum);
}
/*
通过递归算法实现.
参数列表:int
返回值类型: int
*/
public static int getSum(int num) {
/*
num为1时,方法返回1,
相当于是方法的出口,num总有是1的情况
*/
if(num == 1){
return 1;
}
/*
num不为1时,方法返回 num +(num-1)的累和
递归调用getSum方法
*/
return num + getSum(num-1);
}
}
-
递归求阶乘
阶乘:所有小于及等于该数的正整数的积。
n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1
public class DiGuiDemo {
//计算n的阶乘,使用递归完成
public static void main(String[] args) {
int n = 3;
// 调用求阶乘的方法
int value = getValue(n);
// 输出结果
System.out.println("阶乘为:"+ value);
}
/*
通过递归算法实现.
参数列表:int
返回值类型: int
*/
public static int getValue(int n) {
// 1的阶乘为1
if (n == 1) {
return 1;
}
/*
n不为1时,方法返回 n! = n*(n-1)!
递归调用getValue方法
*/
return n * getValue(n - 1);
}
}
- 递归打印多级目录
- 分析:多级目录的打印,就是当目录的嵌套。遍历前,无法知道到底有多少级目录,所以我们要使用递归实现。
示例代码
public class DiGuiDemo2 {
public static void main(String[] args) {
// 创建File对象
File dir = new File("E:\\测试文件");
// 调用打印目录方法
printDir(dir);
}
public static void printDir(File dir) {
// 获取子文件和目录
File[] files = dir.listFiles();
// 循环打印
/*
判断:
当是文件时,打印绝对路径.
当是目录时,继续调用打印目录的方法,形成递归调用.
*/
for (File file : files) {
// 判断
if (file.isFile()) {
// 是文件,输出文件绝对路径
System.out.println("文件名:"+ file.getAbsolutePath());
} else {
// 是目录,输出目录绝对路径
System.out.println("目录:"+file.getAbsolutePath());
// 继续遍历,调用printDir,形成递归
printDir(file);
}
}
}
}