File文件

File

中构造方法中File(file,string)传入父路径,和子路径

boolean delete()     删除此抽象路径名表示的文件或目录   只能删除空文件夹   删除文件时  文件不能被其他程序占用
boolean exists()    测试此抽象路径名表示的文件或目录是否存在。
File getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。
String getAbsolutePath()     返回此抽象路径名的绝对路径名字符串。
String getName()      返回由此抽象路径名表示的文件或目录的名称。
String getParent()      返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
boolean isDirectory()   测试此抽象路径名表示的文件是否是一个目录。
boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 
long length()  返回由此抽象路径名表示的文件的长度

String中的endswith方法判断后缀为什么的字符串

过滤器

实现fileNamefitor或者filefitor接口里面有参数我们可以试一试就知道什么意思了

package cn.jiedada.fileter;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;

public class Test {
    /*
     * 文件过滤器
     * 调用方法
     * String[] list(FilenameFilter filter) 返回的字符串在该目录下的抽象路径名,满足指定的过滤器表示文件和目录命名数组。  
       File[] listFiles() 返回表示抽象路径名的目录中的文件的路径名表示抽象的数组。  
       File[] listFiles(FileFilter filter) 返回表示的抽象路径名的文件和目录的目录,这个抽象路径名满足指定过滤器表示数组。  
       File[] listFiles(FilenameFilter filter) 返回表示的抽象路径名的文件和目录的目录,这个抽象路径名满足指定过滤器表示数组。 

     * 
     * */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File file = new File("f:/log");
        MyFileFilter myFileFilter = new MyFileFilter("txt");
        File[] listFiles = file.listFiles(myFileFilter);
        //当盘符错误时,我们输出的结果为null
        //System.out.println(Arrays.toString(listFiles));
        //在listFiles(new FilenameFilter() 方法中实现了
         /*public File[] listFiles(FilenameFilter filter) {
                String ss[] = list();
                if (ss == null) return null;
                ArrayList<File> files = new ArrayList<>();
                for (String s : ss)
                    if ((filter == null) || filter.accept(this, s))
                        files.add(new File(s, this));
                return files.toArray(new File[files.size()]);
            }
            所以只需要覆写accept方法就可以了*/

        File[] listFiles2 = file.listFiles(new FilenameFilter() {
            
            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.endsWith("txt");
            }
        });
        System.out.println(Arrays.toString(listFiles2));
    }

}
class MyFileFilter implements FileFilter{
    String ends;
    
    public MyFileFilter(String ends) {
        super();
        this.ends = ends;
    }

    @Override
    public boolean accept(File pathname) {
        // TODO Auto-generated method stub
        return pathname.getName().endsWith(ends);
    }
    
}

或者自己实现原理通过把获取的文件转化为String递归判断endwiths方法

package cn.jiedada.tryanginhome;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class Test2 {
    /*写一段代码完成一下功能:以你们接受每天我发给你们的资料的根目录为准,
     *找出其中的所有的视频文件,然后再一个新的路径下面创建对应的文件,暂时不考虑内容,只要有文件就行
         例如:下面这样的效果,以20150421第一季为根目录
       1首先考录自带的文件过滤器,因为自带的llistfiles方法是判断是文件夹下的,所以我们需要递归的方法(暂时不考虑)
       2自己写一个方法用string的endwith方法判断是否包含后缀名*/
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("D:\JAVA上课学习内容\2019-07-31-IO-DAY19");
        ArrayList<File> arrayList = new ArrayList<File>();
        select(file, arrayList);
        //得到数组
        System.out.println(arrayList);
        ArrayList<String> arrayList2 = new ArrayList<String>();
        File file2 = new File("f:/java学习资料");
        //创建文件夹
        file2.mkdirs();
        for (File file3 : arrayList) {
            //获取文件的后缀名
            String name = file3.getName();
            //使用构造方法,指定父文件,传入名字
            File file4 = new File(file2, name);
            file4.createNewFile();
        }
    }
    public static void select(File file,ArrayList<File> arrayList){
        if(file!=null){
            if(file.isFile()){
                //如果为文件的话我们判断后缀是否为avi
                if(file.getName().endsWith("avi")){
                    arrayList.add(file);
                }
            }else{
                //如果为文件夹的话取出子文件及文件夹
                File[] listFiles = file.listFiles();
                for (File file2 : listFiles) {
                    //递归调用
                    select(file2, arrayList);
                }
            }
        }
    }

}
View Code

递归循环

做一个文件删除和保存删除的数据的方法

首先判断是不是文件,然后deletefng'fa方法,在文件夹中递归调用方法

再删除之前用一个容器存储数据

package cn.jiedada.tryanginhome;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class Test1 {
    /*
     * 完成上课所提到的删除方法
                【高级部分】:撤销删除(撤销上面刚删除的目录)功能
       因为delete方法只能删除一个文件,不能有子文件所以我们想用递归的方法
       撤回,我们需要判断是文件夹还是文件,分别在删除之前存放在一个容器里面
         */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("F:\log");
        //文件存放
        ArrayList<File> arrayList1 = new ArrayList<File>();
        //文件夹存放
        ArrayList<File> arrayList2 = new ArrayList<File>();
        delFile(file, arrayList1, arrayList2);
        System.out.println(arrayList1);
        System.out.println(arrayList2);
        //循环添加文件夹
        for (File file2 : arrayList2) {
            file2.mkdirs();
        }
        //添加文件
        for (File file1 : arrayList1) {
            file1.createNewFile();
        }

    }
    public static void delFile(File file,ArrayList<File> arrayList1,ArrayList<File> arrayList2){
        if(file!=null){
            if(file.isFile()){
                //存放文件
                arrayList1.add(file);
                //删除文件
                file.delete();
            }else{
                //存放文件夹
                arrayList2.add(file);
                File[] listFiles = file.listFiles();
                if(listFiles.length!=0){
                for (File file2 : listFiles) {
                    //递归调用
                    delFile(file2, arrayList1, arrayList2);
                }
              }
            }
        }
        //递归删除文件夹
        file.delete();
    }

}
View Code
原文地址:https://www.cnblogs.com/xiaoruirui/p/11285903.html