File

作者: Anwfly | 来源:发表于2020-07-28 16:32 被阅读0次

一、File类的概述和构造方法

1. File类的概述和构造方法

概述:文件和目录路径名的抽象表示形式。
构造:File类提供了不同的构造方法来创建对象,方法如下:

//参数是文件的路径字符串,例如D:\1702A\day07\.project
public File(String pathname)
//第一个参数是文件所在文件夹路径,第二个参数是文件名    
public File(String parent,String child)
//第一个参数是文件所在文件夹对象,第二个参数是文件名
public File(File parent,String child)

案例代码:

public static void main(String[] args) {
    //通过本文件夹路径创建File对象
    File file1 = new File("c:\\a.txt");
    //通过父文件夹路径和本文件夹名字创建File对象
    File file2 = new File("c:\\abc", "d.txt"); 
    File file3 = new File("c:\\abc");
    //通过父文件夹对象和本文件夹名字创建File对象
    File file4 = new File(file3, "e.txt");
}

二、File类的成员方法

1. 创建功能

创建文件夹和文件的方法:

//创建文件,不存在返回true 存在返回false
1.boolean createNewFile() 
//创建一个目录
2.boolean mkdir() 
//创建多级目录
3.boolean mkdirs()

案例代码:

public static void main(String[] args) throws IOException {
    //在c盘下创建a.txt文件
    File file1 = new File("c:\\a.txt");
    file1.createNewFile();//创建文件
    //在c盘下创建abc文件夹
    File file2 = new File("c:\\abc");
    file2.mkdir();//创建
}

2. 删除功能

删除的方法:

//删除
1.boolean delete() 
//文件使用完成后删除   
2.boolean deleteOnExit() 

案例代码:

import java.io.File;
import java.io.IOException;
public class FileDemo2 {
    public static void main(String[] args){
        File f =new File("d:\\1.txt");
        try {
            System.out.println(f.createNewFile());//当文件存在时返回false
            System.out.println(f.delete());//当文件不存在时返回false
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行结果:

文件被删除

3. 重命名功能

//参数是要改成的名字
public boolean renameTo(File dest)

案例代码:

public static void main(String[] args) throws IOException {
    //创建a.txt文件对象
    File file1 = new File("c:\\a.txt");
    //创建新文件名b.txt对象
    File file2 = new File("c:\\b.txt");
    file1.renameTo(file2);//重命名
}

*注意:

1.路径以盘符开始:绝对路径 c:\a.txt
2.路径不以盘符开始:相对路径 a.txt
3.相对路径是根据其父层文件夹作为依据,我们这里的父层文件夹时项目目录。

4. 判断功能

判断方法:

//是否是文件夹
public boolean isDirectory()
//是否是文件
public boolean isFile()
//是否存在
public boolean exists()
//是否可读
public boolean canRead()
//是否可写
public boolean canWrite()
//是否隐藏
public boolean isHidden()

案例代码:

public static void main(String[] args) throws IOException {
    File f1 = new File("c:\\abc");
    System.out.println("abc是否是文件夹:"+f1.isDirectory());
    File f2 = new File("c:\\b.txt");
    System.out.println("b是否是文件:"+f2.isFile());
    System.out.println("b是否存在:"+f2.exists());
    System.out.println("b是否可读:"+f2.canRead());
    System.out.println("b是否可写:"+f2.canWrite());
    System.out.println("b是否隐藏:"+f2.isHidden());
}

9.2.5 基本获取功能

获取方法:

//获取名字
public String getName()
//获取路径
public String getPath()
//获取绝对路径
public String getAbsolutePath()
//如果没有父目录返回null
public String getParent()
//获取最后一次修改的时间
public long lastModified()
//获取文件的长度
public long length()
//获取机器盘符
public File[] liseRoots()

案例代码:

public static void main(String[] args) throws IOException {
    File f1 = new File("c:\\abc\\d.txt");
    System.out.println("名字:"+f1.getName());
    System.out.println("路径:"+f1.getPath());
    System.out.println("相对路径:"+f1.getAbsolutePath());
    System.out.println("父文件夹:"+f1.getParent());
    System.out.println("最后一次修改时间:"+f1.lastModified());
    System.out.println("文件大小:"+f1.length());
    System.out.println("获取盘符:"+f1.listRoots());
}

6. 高级获取功能

//获取指定目录下的所有文件或者文件夹的名称数组
public String[] list()
//获取指定目录下的所有文件或者文件夹的名称数组时进行过滤,参数是过滤器
public String[] list(FilenameFilter filter)
//获取指定目录下的所有文件或者文件夹
public File[] listFiles():
//获取指定目录下的所有文件或者文件夹时进行过滤,参数是过滤器
public File[] listFiles(FileFilter filter):

案例如下:列出磁盘下的文件和文件夹的名字

public class FileDemo3 {
     public static void main(String[] args){
         File[] files =File.listRoots();//获得所有磁盘根目录
         for(File file:files){//遍历得到每一个磁盘根目录
             System.out.println(file);
             if(file.length()>0){
                 String[] filenames =file.list();//得到磁盘根目录下的文件和文件夹的名字
                 for(String filename:filenames){//遍历得到每一个名字
                     System.out.println(filename);
                 }
             }
         }
     }
 }

案例如下:指定一个目录,返回File数组

public static void main(String[] args) {
    File file = new File("c:\\");//获得c盘文件夹对象
    File[] files = file.listFiles();//获得c盘下的文件和文件夹对象
    System.out.println(Arrays.toString(files));//打印
}

三、递归

1. 递归概念

方法调用方法本身的现象

2. 递归注意事项

1.要有出口,否则就是死递归
2.次数不能太多,否则就内存溢出
3.构造方法不能递归使用

递归实现:实现一个数字的阶乘

代码实现:

public static void main(String[] args) {    
    int i = jieCheng(3);//调用递归方法计算3的阶乘,结果是6  ,3*2*1=6
    System.out.println(i);//打印结果
}
public static int jieCheng(int n){
    if(n==1){
        return 1;
    }else {
        return n*jieCheng(n-1);//阶乘计算
    }
}

运行结果:

6

3. 递归解决问题的思想

兔子问题(斐波那契数列)
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

分析:
我们要想办法找规律,兔子对数
第一个月: 1
第二个月: 1
第三个月: 2
第四个月: 3
第五个月: 5
第六个月: 8
...

由此可见兔子对象的数据是:

​ 1,1,2,3,5,8...

规则:

1.从第三项开始,每一项是前两项之和
2.而且说明前两项是已知的

public class FibonacciDemo{
    public static void main(String[] args) {
        for (int counter = 0; counter <= 10; counter++) {
            System.out.printf("Fibonacci of %d is: %d\n",
                    counter, fibonacci(counter));
        }
    }

    public static long fibonacci(long number) {
        if ((number == 0) || (number == 1))
            return number;
        else
            return fibonacci(number - 1) + fibonacci(number - 2);
    }
}

4. 递归使用-遍历文件夹及子文件夹所有文件

案例1:遍历文件夹,不删除

//列出E:\\积云\\java目录下Java源文件的名字
public static void main(String[] args) {        
    File f=new File("C:\\积云\\java");
    cha(f);         
}
private static void cha(File f) {
    File[] li = f.listFiles();//得到文件夹下的文件和文件夹
    for (File file : li) {
        if(file.isDirectory()){//是文件夹,继续扫描
            cha(file);
        }else{
            String name = file.getName();
            if(name.endsWith("java")){//是否是java文件
                System.out.println("java文件是: "+file.getName());
            }
        }
    }
}

案例2:遍历删除文件夹下所有的文件和文件夹

import java.io.File;
import java.util.Arrays;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        File dir = new File("C:\\积云");//实例化 积云 文件夹
        File[] files = dir.listFiles();//得到文件夹下的文件和文件夹
        for (int i = 0; i < files.length; i++) {
            boolean flag = files[i].isFile();//是否是文件
            if (flag) {
                files[i].delete();//是文件则删除
            } else {
                getAllFiles(dir, 0);//得到文件夹下的文件和文件夹
            }
        }
        deleteAll(dir);//删除积云文件夹下所有的空文件夹
        System.out.println("over");
        getAllFiles(dir, 0);
    }
    
    public static void getAllFiles(File dir, int level) {
        System.out.println(getLevel(level) + dir.getName());
        level++;
        File[] files = dir.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                // 这里面用了递归的算法
                getAllFiles(files[i], level);
            } else {
                System.out.println(getLevel(level) + files[i]);
            }
        }
    }

    public static String getLevel(int level) {
        // A mutable sequence of characters.
        StringBuilder sb = new StringBuilder();
        for (int l = 0; l < level; l++) {
            sb.append("|--");
        }
        return sb.toString();
    }
    
    // 递归删除指定路径下的所有文件
    public static void deleteAll(File file) {
        if (file.isFile() || file.list().length == 0) {
            file.delete();
        } else {
            File[] files = file.listFiles();
            for (File f : files) {
                deleteAll(f);// 递归删除每一个文件
                f.delete();// 删除该文件夹
            }
        }
    }

}

5. Debug模式遍历文件

遍历过程中通过Debug模式跟踪

相关文章

网友评论

      本文标题:File

      本文链接:https://www.haomeiwen.com/subject/ykafrktx.html