### File类的概述和构造方法

IO 流是用来进行设备之间的数据传输的
像电脑上的这些,文件,他就属于数据, 我们的数据,是以文件的形式来体现的。文件是数据的载体
那Java为了我们方便的去描述这个文件,或目录,给我们提供了一个类File;File 就是用来描述一个文件或者文件夹(目录),文件和目录路径名的抽象表示形式。

File类的常用构造方法
  1. File(File parent, String child)
    根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
  2. File(String pathname)
    通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  3. File(String parent, String child)
    根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
  4. 路径:绝度路径,相对路径
    绝对路径:带有盘符号的详细路径 E:\MySQL\MySQL Server 5.5\lib\libmysql.lib
    相对路径:不带有盘符号的路径 那我们的Java项目来说,相对路径,就是在我们项目的根目录下
  • 代码演示:
//通过一个绝对路径,或相对路径,来封装换一个文件
File file = new File("b.txt");
File file1 = new File("E:\\IdeaProjects\\20190507-MyJavaDemo-File-类-下午\\c.txt");
//创建一个文件(创建实体文件),第一次创建成功,返回true,重复创建返回false
boolean newFile = file1.createNewFile();

//封装一个目录
File out = new File("out");


//File(File parent, String child)
//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
// new File("E:\\test\\test.txt");
File file2 = new File("E:\\test");
File file3 = new File(file1, "test.txt");


//File(String parent, String child)
//根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File file4 = new File("E:\\test", "test.txt");

./ 表示当前目录
…/ 当前目录的上一级目录 …/…/ 当前目录的上两级目录

File file = new File("../../ff.txt");
       file.createNewFile();

      File file2 = new File("E:\\IdeaProjects\\20190507-MyJavaDemo-File-类-下午\\c.txt");
	file2.createNewFile();

文件的创建及删除方法

  • 创建文件夹的方式
public class MyTest {
    public static void main(String[] args) {
        //我要创建目录
        File file = new File("C:\\Users\\Administrator\\Desktop\\abc");
        //创建单级目录
        boolean b = file.mkdir();//第一次创建成功返回true ,如果重复创建则返回false
        System.out.println(b);

        File file2 = new File("C:\\Users\\Administrator\\Desktop\\aaa\\ccc");
        //创建多级目录
        boolean b1 = file2.mkdirs();  // 第一次创建成功返回true, 如果重复创建则返回false
    }
}
  • 文件的删除方法
public class MyTest2 {
    public static void main(String[] args) {
        File file2 = new File("C:\\Users\\Administrator\\Desktop\\aaa");
        //使用delete()方法删除文件或目录,回收站是找不到的
        //delete() 这个方法只能删除文件和空目录,非空目录目录,删不了
        //如果要删除多级非空目录,得自己写代码实现
        boolean delete = file2.delete();
        System.out.println(delete);
    }
}
  • 文件的重命名
public class MyTest3 {
    public static void main(String[] args) {
        //注意renameTo(file1);这个方法,如果我们传入的这个文件对象,跟源文件在同一个目录下,是重命名
        //如果如果我们传入的这个文件对象,跟源文件不在同一个目录下,剪切并重命名。
        File file = new File("b.txt");
        //把b.txt 改成 b.txt
        File file1 = new File("E:\\bbb.txt");
        //重命名一个文件
        boolean b = file.renameTo(file1);
        System.out.println(b);
    }
}

文件的属性判断方法

  • 判断是文件还是文件夹
public class MyTest {
    public static void main(String[] args) {
        //有关判断的方法
        File file = new File("c.txt");
        //判断是否是一个文件
        boolean file1 = file.isFile();
        //判断是否是一个目录
        boolean directory = file.isDirectory();
        System.out.println(file1);
        System.out.println(directory);
        System.out.println("----------------------");
        File out = new File("out");
        System.out.println(out.isFile());
        System.out.println(out.isDirectory());

    }
}
  • 判断文件是否可读可写
public class MyTest2 {
    public static void main(String[] args) {
        File file = new File(System.getProperty("user.home") + "\\desktop", "ddd.txt");
        boolean b = file.canRead();//判断文件是否可读
        boolean b1 = file.canWrite();//判断文件是否可写入
        boolean hidden = file.isHidden();//判断文件是否隐藏
        System.out.println(b);
        System.out.println(b1);
        System.out.println(hidden);


        File file1 = new File("cccc.txt");
        //判断文件或目录是否存在
        boolean exists = file1.exists();
        System.out.println(exists);
        boolean absolute = file1.isAbsolute();
        System.out.println(absolute);
    }
}

获取文件的一些常用属性

  • 获取文件的路径
public class MyTest {
    public static void main(String[] args) {
        File file = new File("aaa.txt");

      String absolutePath = file.getAbsolutePath(); //获取绝对路径的字符串表现形式
      File file1 = file.getAbsoluteFile(); //获取据对路径的Flie表现形式,这种形式更加灵活


        File file2 = new File("c.txt");
        //获取相对路径的字符串表现形式
        String path = file2.getPath();
        System.out.println(path);

	File file3 = new File(new File("E:\\IdeaProjects\\20190507-MyJavaDemo-File-类-下午"),"c.txt");
	//获取文件的父路径的字符串表现形式
	String parent = file3.getParent();
	//获取文件的父路径的File表现形式,这种更加灵活
	File parentFile = file3.getParentFile();
	System.out.println(parent);
	System.out.println(parentFile.toString());
	        
    }
}
  • 获取目录的容量
public class MyTest3 {
    public static void main(String[] args) {
        File file = new File("E:\\");
        //获取该目录的总容量,单位是字节
        long totalSpace = file.getTotalSpace();
        System.out.println(totalSpace/1024/1024/1024.0);
        //获取剩余容量
        long freeSpace = file.getFreeSpace();
        System.out.println(freeSpace/ 1024 / 1024 / 1024.0);
        //没有现成的获取已使用容量的方法
        //获取使用的容量=总容量-剩余容量;
    }
}
  • 获取文件的长度
public class MyTest4 {
    public static void main(String[] args) {
        File file = new File("ee.txt");
        //获取文件名
        String name = file.getName();
        //获取文件长度
        long length = file.length();
        System.out.println(length);
        System.out.println(name);
    }
}

注意:文件夹没有长度,只有容量

  • 获取文件的最后修改时间
public class MyTest5 {
    public static void main(String[] args) {
        //获取文件的最后一次修改时间
        File file = new File("C:\\Users\\Administrator\\Desktop\\ddd.txt");
        //获取文件的最后一次修改时间,返回的是毫秒值
        long time = file.lastModified();
        //把上面的毫秒值,转换成年月日,时分秒
        Date date = new Date(time);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format1 = format.format(date);
        System.out.println(format1);

    }
}

文件的遍历

public String[] list ():获取指定目录下的所有文件或者文件夹的名称的数组

public class MyTest {
    public static void main(String[] args) {
        //public String[] list ():获取指定目录下的所有文件或者文件夹的名称的数组

        File file = new File("E:\\test");
        
//把此目录下的所有文件或文件夹全部放到,数组中
        String[] list = file.list();
        for (String s : list) {
            System.out.println(s);
        }
    }
}

public File[] listFiles ():获取指定目录下的所有文件或者文件夹的File数组
相比 public String[] list ()更加灵活

public class MyTest2 {
    public static void main(String[] args) {
        //public File[] listFiles ():获取指定目录下的所有文件或者文件夹的File数组
        File file = new File("E:\\test");
        File[] files = file.listFiles();
        for (File f : files) {
            String name = f.getName();
            System.out.println(name+"== 大小"+f.length());
        }
    }
}
  • 案例演示:
  • 需求:判断E盘demo目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
  1. 利用listFiles
public class MyTest {
    public static void main(String[] args) {
        //A:利用listFiles
               File file = new File("E:/demo");
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile() && f.getName().endsWith(".jpg")) {
                System.out.println(f.getName());
            }
        }
    }
}
  1. 利用文件过滤器
public class MyTest2 {
    public static void main(String[] args) {
        File file = new File("E:/demo");

        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                //System.out.println(dir);//父路径
                //System.out.println(name);//子文件名
                File file1 = new File(dir, name);
                if(file1.isFile()&&file1.getName().endsWith(".jpg")){
                    return true;
                }else {
                    return false;
                }
            }
        });

        System.out.println(Arrays.toString(files));
    }
}