File 类
目录
File类概述
- File类在包java.io.File下、代表操作系统的文件对象(文件、文件夹)
- File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(文件夹)等功能
File类创建对象
方法名称 | 说明 |
---|---|
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent,String child) | 从父路径名字符串和子路径名字符串创建文件对象 |
public File(File ,String child) | 根据父路径对应对象和子路径字符串创建文件对象 |
- File对象可以定位文件和文件夹
- File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
绝对路径和相对路径
- 绝对路径:从盘符开始
- 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。
public class FileDemo01 {
public static void main(String[] args) {
//1.创建File对象(指定了文件的路径)
//路径的写法:E:\picture\日志体系结构.png
// E:/picture/日志体系结构.png
// File.separator
//File file = new File("E:\\picture\\日志体系结构.png");
File file = new File("E:"+File.separator+"picture"+File.separator+"日志体系结构.png");
long length = file.length();
System.out.println(length);
//2.创建File对象,支持绝对路径,支持相对路径
File f = new File("E:\\picture\\日志体系结构.png");//绝对路径
System.out.println(f.length());
//相对路径:一般定位到模块中的文件的。相对到工程下
File f2 = new File("src\\data2.txt");
System.out.println(f2.length());
//3.File创建对象,可以是文件也可以是文件夹
File f3 = new File("E:/code");
System.out.println(f3.exists());
}
}
output:
199995
199995
8
true
File类的常用API
判断文件类型、获取文件信息
方法名称 | 说明 |
---|---|
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在。 |
File getAbsoluteFile() | 返回此抽象路径名的绝对形式。 |
String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串。 |
String getPath() | 将此抽象路径名转换为路径名字符串。 |
long length() | 返回此抽象路径名表示的文件的长度。 |
String getName() | 返回此抽象路径名表示的文件或目录的名称 |
long lastModified() | 返回此抽象路径名表示的文件最后一次修改的时间。 |
public class FileDemo02 {
public static void main(String[] args) {
File f1 = new File("E:\\code\\javasepromax\\file-io-app1\\src\\data2.txt");
System.out.println(f1.length());
System.out.println(f1.getAbsolutePath());
File f2 = new File("src\\data2.txt");
System.out.println(f2.length());
System.out.println(f2.getPath());
System.out.println(f2.getAbsolutePath());
System.out.println(f2.exists());
long l2 = f2.lastModified();
System.out.println(new SimpleDateFormat("最后修改的时间:"+"yyyy-MM-dd HH:mm:ss").format(l2));
}
}
8
E:\code\javasepromax\file-io-app1\src\data2.txt
8
src\data2.txt
E:\code\javasepromax\file-io-app1\src\data2.txt
true
最后修改的时间:2022-01-19 12:32:56
File类创建文件的功能
方法名称 | 说明 |
---|---|
public boolean createNewFile() | 创建一个空的文件 |
public boolean mkdir() | 只能创建一级文件夹 |
public boolean mkdirs() | 可以创建多级文件夹 |
File类删除文件功能
方法名称 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径表示的文件或空文件夹 |
- delete方法直接删除不走回收站;如果删除的是一个文件,且文件没有被占用则直接删除
- delete方法默认只能删除空文件夹
遍历文件夹
File类的遍历功能
方法名称 | 说明 |
---|---|
public String[] list() | 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。 |
public File[] listFiles() | 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回 |
listFiles方法注意事项:
- 当调用者不存在时,返回null
- 当调用者是一个文件时,返回null
- 当调用者是一个空文件夹时,返回一个长度为0的数组
- 当调用者是一个有内容的文件夹时,将里面所有的文件和文件夹路径放在File数组中返回
- 当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容
- 当调用者是一个需要权限才能进去的文件夹时,返回null
public class FileDemo03 {
public static void main(String[] args) {
File f1 = new File("E:/picture");
String[] list = f1.list();
for (String s : list) {
System.out.println(s);
}
File f2 = new File("E:/picture/aa/bb/cc");
System.out.println(f2.mkdir());
System.out.println(f2.mkdirs());
File[] files = f1.listFiles();
System.out.println(Arrays.toString(files));
}
}
output:
aa
Collection.png
Throwable.xmind
Throwable1.png
日志体系结构.png
编译时和运行时异常.png
false
false
[E:\picture\aa, E:\picture\Collection.png, E:\picture\Throwable.xmind, E:\picture\Throwable1.png, E:\picture\日志体系结构.png, E:\picture\编译时和运行时异常.png]
方法递归
递归的形式和特点
什么是方法递归?
- 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion)。
- 递归做为一种算法在程序设计语言中广泛应用
递归的形式
- 直接递归:方法自己调用自己。
- 间接递归:方法调用其他方法,其他方法又回调自己。
方法递归存在的问题?
- 递归如果没有控制终止,会出现递归死循环,导致栈内存溢出现象
递归的算法流程、核心要素
案例:计算1-n的阶乘
需求:计算1-n的阶乘的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点
public class RecursionDemo {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n){
if (n==1){
return 1;
}else {
return f(n-1)*n;
}
}
}
output:
120
递归解决问题的思路:
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
**递归算法的三大要素大体可以总结为:
- 递归的公式:f(n) = f(n-1) * n ;
- 递归的终结点:f(1)
- 递归的方法必须走向终结点:
递归常见案例
public class RecursionDemo02 {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n) {
if (n == 1) {
return 1;
} else {
return f(n - 1) + n;
}
}
}
output:
15
递归解决问题
public class RucursionDemo03 {
public static void main(String[] args) {
System.out.println(f(1));
}
public static int f(int n) {
if (n == 10) {
return 1;
} else {
return 2*f(n+1) + 2;
}
}
}
output:
1534
非规律化递归案例- 文件搜索
public class RecursionDemo04 {
public static void main(String[] args) {
searchFile(new File("E:/"), "csl.exe");
}
public static void searchFile(File dir, String fileName) {
//1.判断搜索盘符是否是目录且不为空
if (dir.isDirectory() && dir != null) {
//可以找了
//2.提取当前目录下的一级文件对象
File[] files = dir.listFiles();
//3.判断是否存在一级目录对象
if (files !=null && files.length>0) {
for (File file : files) {
//4.判断当前遍历的一级对象是目录还是文件
if (file.isFile()) {
//5.是文件,判断是不是我们要找的,是,输出其绝对路径
if (file.getName().contains(fileName)) {
System.out.println("恭喜你找到了!" + file.getAbsolutePath());
}
} else {
//是文件夹,继续递归寻找
searchFile(file, fileName);
}
}
}
} else {
System.out.println("当前搜索的位置不是文件夹!");
}
}
}
output:
恭喜你找到了!E:\SelfStudy\JavaSE\out\production\基础语法\test\Demo01\csl.exe
非规律化递归案例- 啤酒问题
public class RecursioinDemo06 {
public static int totalNumber;//总瓶数
public static int lastBottleNumber;//记录每次空瓶子数量
public static int lastCoverNumber;//记录每次的瓶盖数量
public static void main(String[] args) {
buy(10);
System.out.println("总数:"+totalNumber+"剩余瓶盖:"+lastCoverNumber +"剩余空瓶:"+lastBottleNumber);
}
private static void buy(int money) {
//2.看看可以立马买多少瓶
int buyNumber = money / 2;
totalNumber += buyNumber;
//3.把瓶子和盖子换算成钱
//统计本轮的盖子和空瓶总数
int coverNumber = lastCoverNumber + buyNumber;
int bottleNumber = lastBottleNumber + buyNumber;
//4.统计可以换算成多少钱
int allMoney = 0;
if (coverNumber >= 4) {
allMoney += (coverNumber / 4) * 2;
}
lastCoverNumber = coverNumber % 4;
if (bottleNumber >= 2) {
allMoney += (bottleNumber / 2) * 2;
}
lastBottleNumber = bottleNumber % 2;
if (allMoney >= 2) {
buy(allMoney);
}
}
}
output:
总数:15剩余瓶盖:3剩余空瓶:1