File类:
什么是File类:
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
构造方法:
- public File(String pathname) : 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
- public File(String parent,String child) :从父路径名字串和子路径名字符串创建新的 File实例.
- public File(File parent,String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
示例代码如下:
public static void main(String[] args) {
//File的构造方法比较灵活,可以根据具体的需要选择使用
File fl = new File("D:/aa/hello.txt"); // f1就代表了这个文件
File f2=new File("d:/aa", "hello.txt");
File file = new File("d:/aa");
File f3 = new File(file, "hello.txt");
}
注意:
- 一个File对象代表硬盘中实际存在的一个文件或者目录。
- 无论该路径下是否存在文件或者目录,都不影响File对象的创建
常用方法:
- public string getAbsolutePath() : 返回此File的绝对路径名字符串。
- public String getPath():将此File转换为路径名字符串。
- public String getName():返回由此File表示的文件或目录的名称。
- public long length():返回由此File表示的文件的长度
接下来,我们举例说明:
public static void main(String[] args) {
File f1=new File("d:/aa/bb/bb.txt");//创建了 文件 映射对象
File f2=new File("./bb.txt");//创建了 文件 映射对象
String absolutePath1 = f1.getAbsolutePath();
String absolutePath2 = f2.getAbsolutePath();
System.out.println("文件的绝对路径:"+absolutePath1);//绝对磁盘路径
System.out.println("文件的绝对路径:"+absolutePath2);//绝对磁盘路径
String path1 = f1.getPath();
String path2 = f2.getPath();
System.out.println("文件定义的路径:"+path1);//定义的时候的文件路径名
System.out.println("文件定义的路径:"+path2);
String name1 = f1.getName();
String name2 = f2.getName();
System.out.println("文件名称:"+name1);
System.out.println("文件名称:"+name2);
String parent1 = f1.getParent();
String parent2 = f2.getParent();
System.out.println("父路径:"+parent1);
System.out.println("父路径:"+parent2);
File parentFile1 = f1.getParentFile();
File parentFile2 = f2.getParentFile();
System.out.println("父路径:"+parentFile1);
System.out.println("父路径:"+parentFile2);
long length = f1.length();
System.out.println("文件的大小:"+length);
}
如下图所示,我们bb.txt里面的内容:
运行结果如下:
注意:
如果我们在txt里输入一个文字,则"文件的大小"输出的是3,一个文字的长度最小是2
绝对路径和相对路径:
绝对路径:从盘符开始的路径,这是一个完整的路径
相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用
判断功能方法:
- public boolean exists ():此File表示的文件或目录是否实际存在。
- public boolean isDirectory() : 此File表示的是否为目录
- public boolean isFile() :此File表示的是否为文件。
示例代码如下:
public static void main(String[] args) {
File f1=new File("d:/aa/bb/bb.txt");//创建了 文件 映射对象
File f2=new File("./bb.txt");//创建了 文件 映射对象
File f3=new File("d:/aa/bb");//创建了 文件 映射对象
//判断该文件或文件夹是否存在
System.out.println(f1.exists());
System.out.println(f2.exists());
System.out.println(f3.exists());
System.out.println("------");
//判断是否为文件夹
System.out.println(f1.isDirectory());
System.out.println(f3.isDirectory());
System.out.println("------");
//判断是否为文件
System.out.println(f1.isFile());
System.out.println(f3.isFile());
}
运行结果如下:
File类的创建和删除:
public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件
public boolean delete():删除由此File表示的文件或目录。
public boolean mkdir():创建由此File表示的目录。
public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录
示例代码如下:
public static void main(String[] args) throws IOException {
//File类对象创建 文件的创建
File f1 = new File("D:/aa/bb/b.txt");
//1.如果文件的前置目录路径不存在,则抛出异常;2.文件前置的目录路径存在,文件不存在则创建一个空文件;文件存在则不做任何操作
f1.createNewFile();
//File类对象创建 文件夹的创建
File f2 = new File("D:/bb/cc/dd");
//该方法要求所有前置目录已经存在,才会创建对应的文件夹 dd
//f2.mkdir();
//该方法可以自动补全所有父目录,并创建文件夹,一般使用该方法
f2.mkdirs();
//File类对象的删除
File f3 = new File("D:/bb/cc/dd");
f3.delete();
}
注意:
1.删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。
2.删除文件的时候,不管里面有没有内容,可以直接删除。
来让我们看一道练习题:
在D盘中aa/bb/cc的目录中创建一个c.txt的文件,要求全部使用程序创建
File f1 = new File("D:/aa/bb/cc");
File f2 = new File(f1,"c.txt");
f1.mkdirs();
f2.createNewFile();
递归:
我们所学的实现循环的方式有哪些?
while do-while for
今天再来学习一个递归。
什么是递归:
它是指一段程序直接或者间接调用自身的一种方法,通过这种形式执行需要进行一些固定步骤的许多操作,它可以把一个复杂并且庞大的问题简单化,通过专注于解决它分化出来的小问题从而解决大问题,从而大大减少我们的代码量,是提高我们编码效率的很好方法。
递归的特点:
递归有两个显著的特征,终止条件和自身调用:
终止条件:递归必须有一个终止的条件,要不然就会无限循环地调用本身。
自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
递归解题思路:
解决递归问题一般就三步曲,分别是:
第一步,定义函数功能
第二步,寻找递归终止条件
第二步,递推函数的等价关系式
接下来,让我们看两个例子:
第一个:用递归实现打印输出1-n
public static void main(String[] args) {
print(10);
}
/**
*递归实现打印输出1-n
* @param n
*/
public static void print(int n) {
if(n>1){
print(n-1);//1——n-1
}
System.out.println(n);//n
}
打印结果如下:
第二个:用递归实现打印1-n的累加求和
public static void main(String[] args) {
int he = sum(10);
System.out.println(he);
}
/**
* 完成1-n的累加求和
* @param n
*/
public static int sum(int n) {
int sum = 0;
sum = sum+n;//累加了n
if (n>0){
sum = sum+sum(n-1);//累加1——(n-1)
}
return sum;
}
运行结果如下:
文件夹的便历:
刚才我们学习了递归思想,接下来就让我们使用递归来 完成文件夹目录的遍历
public class FileRecTest {
public static void main(String[] args) {
//使用递归完成文件夹目录结构的遍历
File f1 = new File("D:/aa");
directoryList(f1);
}
/**
* 完成对传入文件的所有子目录的遍历
* @param file
*/
public static void directoryList(File file) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++){
File temp = files[i]; //获取每一个文件夹
if (temp.isDirectory()){
System.out.println(temp); //bb cc //把当前文件夹打印
directoryList(temp);//当前文件夹的所有子目录打印
}
}
}
}
运行结果: