IO流 - 九、File对象

1、File对象 - 构造函数&字段

//可以将一个已存在的,或者不存在的文件或者目录,封装为File对象
File f1 = new File("c:\\a.txt");
File f2 = new File("c:\\","a.txt");
File f3 = new File("c:\\");
File f4 = new File(f,"a.txt");
File f5 = new File("c:"+File.separator+"abc\\a.txt");
System.out.println(f5);//c:\abc\a.txt

2、File对象 - 常用方法

(1)、获取

获取文件名称、文件路径、文件大小、文件修改时间。
File file = new File("a.txt");
String name = file.getName();
String absPath = file.getAbsolutePath();
String path = file.getPath();
long length = file.length();
long time = file.lastModified();    

(2)、创建和删除

创建文件:如果文件不存在则创建,存在则不创建
File file = new File("a.txt");
boolean b = file.createNewFile();

删除文件:
boolean b = file.delete();    

创建文件夹目录:
File dir = new File("abc");
boolean b = dir.mkdir();//make directory

删除单个文件夹目录:
boolean b = dir.delete();

创建多级目录:
File dir = new File("a\\b\\c\\d");
dir.mkdirs();

(3)、判断

判断文件是否存在
File f = new File("a.txt");
boolean b = f.exists();

判断是否是文件,最好先判断是否存在,不存在则为false
boolean b = f.isFile();

判断是否是目录
boolean b = f.isDerectory();

(4)、重命名

//c盘的0.mp3重命名为了9.mp3并被剪切到了d盘
File f1 = new File("c:\\0.mp3");
File f2 = new File("d:\\9.mp3");
boolean b = f1.renameTo(f2);

(5)、系统根目录和容量获取

系统根目录
File[] files = File.listRoots();
for(File file:files) {
    System.out.println(file);
}
输出结果:/

File file  = new File("//");
System.out.println("getFreeSpace:"+file.getFreeSpace());
System.out.println("getTotalSpace:"+file.getTotalSpace());
System.out.println("getUsableSpace:"+file.getUsableSpace());

(6)、获取目录内容

String[] list()
获取当前目录下的文件以及文件夹的名称,包含隐藏文件。    调用list方法的File对象中封装的必须是目录。

File file = new File("//Users//haojie//Projects//hexo");
String[] contents = file.list();
for(String con:contents) {
    System.out.println(con);
}
输出结果:
scaffolds
.DS_Store
db.json
source
node_modules
public
.gitignore
package.json
_config.yml
.git
.deploy_git
themes             

(7)、过滤器

//通过文件名进行过滤
String[] list(FilenameFilter filter);

public class ListDemo {

    public static void main(String[] args) {
        File dir = new File("//Users//haojie//Projects//hexo//source//_posts");
        String[] names = dir.list(new FileFilterBySuffix(".md"));
        for(String name:names) {
            System.out.println(name);
        }
    }

}

public class FileFilterBySuffix implements FilenameFilter {

    private String suffix;


    public FileFilterBySuffix(String suffix) {
        super();
        this.suffix = suffix;
    }

    public boolean accept(File dir, String name) {
        //通过文件后缀名进行过滤
        return name.endsWith(suffix);
    }

}

//通过文件对象进行过滤
File[] listFiles(FileFilter filter)

public class ListFilesDemo {

    public static void main(String[] args) {
        File dir = new File("//Users//haojie//Projects//hexo");
        File[] files = dir.listFiles(new FileFilterByHidden());

        for(File file:files) {
            System.out.println(file);
        }
    }

}    

public class FileFilterByHidden implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        //过滤非隐藏文件
        return !pathname.isHidden();
    }

}    

3、File对象 - 练习

(1)、深度遍历文件夹

//列出指定文件夹下的所有目录和文件并按层级缩进
public class Demo3 {

    public static void main(String[] args) {
        File dir = new File("//Users//haojie//Projects//hexo//source");
        listAll(dir,0);
    }

    private static void listAll(File dir,int level) {

        System.out.println(getSpace(level)+dir.getName());                
        level++;

        //获取指定目录下当前的所有文件夹或者文件对象
        File[] files = dir.listFiles();

        for (int i = 0; i < files.length; i++) {
            if(files[i].isDirectory()) {
                listAll(files[i],level);
            }else {
                System.out.println(getSpace(level)+files[i].getName());                
            }
        }
    }

    private static String getSpace(int level) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++) {
            sb.append("    ");
        }
        return sb.toString();
    }

}

(2)、递归

注意:递归一定要明确条件,否则会栈溢出

public class Demo4 {

    public static void main(String[] args) {
        toBinary(6);
        System.out.println(getSum(5));
    }

    //num!
    private static int getSum(int num) {
        if(num == 1)
            return 1;
        return num + getSum(num-1);
    }

    //转二进制
    private static void toBinary(int num) {

        if(num > 0) {
            toBinary(num/2);
            System.out.println(num%2);
        }

    }

}

(3)、删除目录

从里往外删,删除指定目录及目录下所有的目录和文件

public class Demo5 {

    public static void main(String[] args) {

        File dir = new File("//Users//haojie//a");
        removeDir(dir);

    }

    private static void removeDir(File dir) {
        File[] files = dir.listFiles();

        for(File file:files) {
            if(file.isDirectory()) {
                removeDir(file);
            } else {
                System.out.println(file+":"+file.delete());
            }
        }

        System.out.println(dir+":"+dir.delete());
    }

}