File: 文件和目录路径名的抽象表示形式,File类的实例是不可改变的

  1. File: 文件和目录路径名的抽象表示形式,File类的实例是不可改变的
  2. * File类的构造方法:
  3. * File(String pathname) 将指定的路径名转换成一个File对象
  4. * File(String parent,String child) 根据指定的父路径和文件路径创建对象
  5. * File(File parent,String child)
  6. * File类常用功能:
  7. * 创建:boolean createNewFile():当指定文件(或文件夹)不存在时创建文件并返回true,否则返回false,路径不存在则抛出异常
  8. * boolean mkdir() :当指定文件(或文件夹)不存在时创建文件夹并返回true,否则返回false
  9. * boolean mkdirs() :创建指定文件夹,所在文件夹目录不存在时,则顺道一块创建
  10.         
  11. * 删除:boolean delete():删除文件
  12.             注意:要删除一个目录,需要先删除这个目录下的所有子文件和子目录
  13. * 获取:File getAbsoluteFile()
  14. * File getParentFile()
  15. * String getAbsolutePath()
  16. * String getParent()
  17. * String getPath()
  18. * long lastModified()
  19. * 判断: boolean exists();
  20. * boolean isAbsolute()
  21. * boolean isDirectory()
  22. * boolean isFile()
  23. * boolean isHidden()
  24. * 修改:boolean renameTo(File dest): 将当前File对象所指向的路径修改为指定File所指的路径 (修改文件名称)

构造方法

方法 描述
public File(File parent, String child) 根据parent抽象路径名和child路径名字符串创建一个新File实例
public File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
public File(String parent, String child) 根据parent路径名字符串和child路径名字符串创建一个新File实例
public File(URL url) 通过将给定的file: URL转换为一个抽象路径名来创建一个新的File实例
  1. public static void fileConstructionMethod() {
  2. // public File(String pathname)
  3. // 通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例
  4. File file1 = new File(pathName);
  5. System.out.println(file1); //C:\Users\xxx\Desktop\exercise\test
  6. // public File(String parent, String child)
  7. // 根据parent路径名字符串和child路径名字符串创建一个新的File实例
  8. File file2 = new File(parent, "test");
  9. System.out.println(file2); //C:\Users\xxx\Desktop\exercise\test
  10. //public File(File parent, String child)
  11. // 根据parent抽象路径名和child路径名字符串创建一个新的File实例
  12. File file3 = new File(file1, "test");
  13. System.out.println(file3); //C:\Users\xxx\Desktop\exercise\test\test
  14. }

创建方法

方法 描述
public boolean createNewFile() throws IOException 创建文件,如果存在这样的文件,就不创建了
public boolean mkdir() 创建文件夹,如果存在这样的文件夹,就不创建了
public boolean mkdirs() 创建文件夹,如果父文件夹不存在,会帮你创建出来
  1. public static void createMethod() {
  2. //根据字符串形式的路径创建一个File对象
  3. File file1 = new File(pathName);
  4. boolean flg = false;
  5. try {
  6. //public boolean createNewFile() throws IOException
  7. //创建文件,如果存在这样的文件,就不创建了
  8. flg = file1.createNewFile();
  9. } catch (IOException e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. }
  13. System.out.println(flg); // true
  14. File file2 = new File(parent,"test1\\test\\test");
  15. //public boolean mkdir()
  16. //创建文件夹,如果存在这样的文件夹,就不创建了(如果你创建的文件夹上面的父类文件夹还没创建的情况下也是不会创建的)
  17. flg = file2.mkdir();
  18. System.out.println(flg); // false,如果你要创建的文件夹与已存在的文件重名也是创建不了的
  19. File file3 = new File(parent,"test2\\test\\test");
  20. // public boolean mkdirs()
  21. // 创建文件夹,如果父文件夹不存在,会帮你创建出来
  22. flg = file3.mkdirs();
  23. System.out.println(flg); // true
  24. }

注意事项:如果你创建文件或者文件夹忘了写盘符路径,那么默认在项目路径下; 同一路径不能出现相同名称的文件和文件夹,这里的相同指的是文件的全名称(待后缀名)

_

重命名和删除功能

方法 描述
public boolean renameTo(File dest) 把文件重命名为指定的文件路径
public boolean delete() 删除文件或者文件夹
  1. public static void renameAndDeleteMethod() {
  2. // 根据字符串形式的路径创建一个文件夹
  3. String parent = "C:\\Users\\hireny\\Desktop\\learning\\exercise" +
  4. "\\day016";
  5. File file = new File(parent ,"personalfilms");
  6. // 创建文件夹
  7. boolean flg = file.mkdir();
  8. System.out.println("创建文件夹:"+flg);
  9. try {
  10. Thread.sleep(5000);
  11. } catch(InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. // 修改文件夹
  15. File file3 = new File(parent, "personalmovies");
  16. flg = file.renameTo(file3);
  17. System.out.println("修改文件夹:"+flg);
  18. // 创建一个名为 TokyoHot.txt文件
  19. File file2 = new File(file3, "TokyoHot.txt");
  20. try {
  21. flg = file2.createNewFile();
  22. } catch(IOException e) {
  23. e.printStackTrace();
  24. }
  25. System.out.println("创建文件:"+flg);
  26. flg = file2.delete();
  27. System.out.println("删除文件:"+flg);
  28. System.out.println("文件夹路径:"+file);
  29. if(flg) flg = file3.delete();
  30. System.out.println("删除文件夹:"+flg);

注意事项:重命名只是将File代表的文件或者文件夹重命名,Java中的File对象所代表的路径还是创建时赋予的路径;Java中的删除不走回收站;要删除一个文件夹,这个文件夹中不能包含文件或者文件夹,必须是空的。

判断功能

方法 描述
public boolean isDirectory() 判断是否是目录
public boolean isFile() 判断是否是文件
public boolean exists() 判断是否存在
public boolean canRead() 判断是否可读
public boolean canWrite() 判断是否可写
public boolean canExecute() 判断是否可执行
public boolean isHidden() 判断是否隐藏
//判断功能
public static void judgmentMethod() {
    //根据字符串形式的路径创建一个File对象
    File file = new File(parent, "test");
    // public boolean isDirectory()
    //判断是否是目录,如果没有目录,不会给你创建目录
    boolean flg = file.isDirectory();
    System.out.println("判断是否是目录:"+flg); // false

    //判断是否是文件
    flg = file.isFile();
    System.out.println(flg); //true

    //判断是否存在
    flg = file.exists();
    System.out.println(flg); //true

    //判断是否可读
    flg = file.canRead();
    System.out.println(flg); //true

    //判断是否可写
    flg = file.canWrite();
    System.out.println(flg); //true

    //判断是否隐藏
    flg = file.isHidden();
    System.out.println(flg); //false

    //判断是否可执行
    flg = file.canExecute();
    System.out.println(flg); //true
}

获取功能

方法 描述
public String getAbsolutePath() 获取绝对路径
public String getPath() 获取路径
public String getName() 获取名称
public long length() 获取长度。字节数
public long lastModified() 获取最后一次的修改时间,毫秒值
public String[] list() 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles() 获取指定目录下的所有文件或者文件夹的File数组
// FIle类的获取功能
public static void getMethod() {
    //根据字符串形式的路径创建一个File对象
    File file = new File(parent, "\\test2");
//      File file = new File("text"); 当你不给文件绝对路径,它会将文件或者文件夹路径设置在项目目录下
    // 获取文件或文件夹的绝对路径,从盘符开始
    String absolutePath = file.getAbsolutePath();
    System.out.println(absolutePath); // 不管这个地址有没有文件或者文件夹,它是获取file对象的绝对路径
    //获取路径,创建file的是什么就是什么
    String path = file.getPath();
    System.out.println(path);
    //获取文件或文件夹的名字
    String name = file.getName();
    System.out.println(name); // test1
    //获取文件的长度,如果是文件夹的话就是0
    long length = file.length();
    System.out.println(length); // 4218字节数
    //最后一个修改时间,没有的话就是创建时间
    long lastModified = file.lastModified();
    System.out.println(lastModified);
    //获取目录下的所有文件或文件夹的名称数组
    String[] filenames = file.list();
    for (String string : filenames) {
        System.out.println(string);
    }
    //获取目录下所有文件或文件夹的File表示对象数组
    File[] files = file.listFiles();
    for (File file2 : files) {
        System.out.println(file2.getName());
    }
}

注意:getAbsolutePath()表示获取绝对路径,一定是从盘符开始的, 但是getPath表示的是路径,在创建file对象的时候给的是什么,就是从什么开始的。

文件名称过滤器

方法 描述
public String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录满足指定过滤器的文件和目录
public File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录

File类的list方法可以获取目录下的各个文件,传入过滤器还能按照特定需求取出需要的文件。
下面来看一下过滤器怎么用的。
首先看 String[] list(FilenameFilter) 查看FilenameFilter源码,发现其实是一个接口:

public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);
}


那么我们要想使用过滤器,应该先实现接口,假设我们要找某个文件夹下的txt文件:

import java.io.File;
import java.io.FilenameFilter;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("C:\\Test");
        if(file.isDirectory()) {
            String[] list=file.list(new FilenameFilterbytxt());//传入过滤器
            for(String l:list) {
                System.out.println(l);
            }
        }
    }
}

class FilenameFilterbytxt implements FilenameFilter{
    @Override
    public boolean accept(File dir, String name) {
        // TODO Auto-generated method stub
        return name.endsWith(".txt");//当文件名以.txt结尾时返回true.
    }

}

但是我们看到第8行代码只是传入了过滤器,那么accept方法是如何被调用的呢?

查看 String[] list(FilenameFilter) 的源码:

/*list(FilenameFilter)源码解析*/
public String[] list(FilenameFilter filter) {
        String names[] = list();//调用list()方法获取所有名称
        if ((names == null) || (filter == null)) {
            return names; 
        }
        List<String> v = new ArrayList<>();//用于保存过滤后的文件名
        for (int i = 0 ; i < names.length ; i++) {//遍历
            //调用filter的accept方法,传入当前目录this和遍历到的名称names[i]
            if (filter.accept(this, names[i])) {
                v.add(names[i]);//满足过滤器条件的添加到集合中
            }
        }
        return v.toArray(new String[v.size()]);//将集合转成数组返回,限定增删操作
    }

也就是说,我们实现的accept方法是在构造器中被调用的。 类似地,FileFilter 也是一个接口,采用匿名内部类的方式实现接口,使用File[] listFiles(FileFilter filter)获取目录下所有文件夹:

import java.io.File;
import java.io.FileFilter;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("C:\\Test");
        if(file.isDirectory()) {
            File[] list=file.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    // TODO Auto-generated method stub
                    return pathname.isDirectory();
                }

            });

            for(File f:list) {
                System.out.println(f);
            }
        }
    }
}


File[] listFiles(FileFilter filter) 方法的源码如下:

/*File[] listFiles(FileFilter filter)源码解析*/
 public File[] listFiles(FileFilter filter) {
        String ss[] = list();//调用list()获取所有的名称数组
        if (ss == null) return null;//健壮性判断,数组为null则返回
        ArrayList<File> files = new ArrayList<>();//创建File类型集合
        for (String s : ss) {//遍历
            File f = new File(s, this);//private File(String child, File parent)私有构造调用
            if ((filter == null) || filter.accept(f))//条件判断
                files.add(f);//添加到集合
        }
        return files.toArray(new File[files.size()]);//集合转成数组返回
    }