(1)基本概念
Java.io.File类主要用于描述文件或目录路径的抽象表示信息,可以获取文件或者目录的特征信息,如大小等。
(2)常用方法
方法声明 | 功能介绍 |
File(String pathname) | 根据参数指定的路径名来构造对象 |
File(String parent,String child) | 根据参数指定的父路径和子路径信息构造对象 |
File(file parent,String child) | 根据参数指定的父抽象路径和子路径信息构造对象 |
boolean exists() | 测试此抽象路径名表示的文件或者目录是否存在 |
String getName() | 用于获取文件的名称 |
long length() | 返回由此抽象路径名表示的文件的长度 |
long lastModified() | 用于获取文件的最后一次修改时间 |
String getAbsolutePath() | 用于获取绝对路径信息 |
boolean delete() | 用于删除文件,当删除目录时要求是空目录 |
boolean createNewFile() | 用于创建新的空文件 |
boolean mkdir() | 用于创建目录 |
boolean mkdirs() | 用于创建多级目录 |
File[ ] listFiles | 获取该目录下的所有内容 |
boolean isFile() | 判断是否为文件 |
boolean isDirectory() | 判断是否为目录 |
File[ ] listFiles(FileFilter filter) | 获取目录下满足筛选器 filter 的所有内容 |
(3)代码示例 【文件操作】
public class FileTest { public static void main(String[] args) throws IOException { // 1、构造File类型的对象与d:/a.txt关联 File f1 = new File("d:/a.txt"); // 2、若文件存在则获取该文件的相对特征信息并打印后删除文件 if (f1.exists()) { System.out.println("文件的名称是:" + f1.getName()); System.out.println("文件的大小是:" + f1.length()); System.out.println("文件的最后一次修改时间是:" + f1.lastModified()); //绝对路径:主要指以根目录开始的路径,如c:/ d:/ //相对路径:主要是以当前目录所在的位置开始的路径信息,如./ ../相对路径 System.out.println("文件的绝对路径信息是" + f1.getAbsolutePath()); System.out.println(f1.delete() ? "文件删除成功" : "文件删除失败"); } else { // 3、若文件不存在则创建新的空文件 System.out.println(f1.createNewFile()?"文件创建成功":"文件创建失败"); } } }
运行结果(一开始,d盘下没有a.txt文件,则首次运行时会创建a.txt文件)
文件创建成功
【此时打开d盘会发现会出现一个名为a.txt的文件,对a.txt进行编辑,手动输入123456;这6个数字,CTRL+C进行内容的保存,然后再次执行这段代码,会显示出对a.txt文件的一些属性信息的相关输出】运行结果如下所示
文件的名称是:a.txt 文件的大小是:6 文件的最后一次修改时间是:1668146689967 文件的绝对路径信息是d:\a.txt 文件删除成功
【这里涉及到最后一次修改时间,因为输出是以毫秒为计量单位,这里我们对时间的输出做一下处理,让它显示我们常见的形式,这里用到了SimpleDateFormat类】代码如下
public class FileTest { public static void main(String[] args) throws IOException { // 1、构造File类型的对象与d:/a.txt关联 File f1 = new File("d:/a.txt"); // 2、若文件存在则获取该文件的相对特征信息并打印后删除文件 if (f1.exists()) { System.out.println("文件的名称是:" + f1.getName()); System.out.println("文件的大小是:" + f1.length()); Date d1=new Date(f1.lastModified()); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("文件的最后一次修改时间是:" + sdf.format(d1)); //绝对路径:主要指以根目录开始的路径,如c:/ d:/ //相对路径:主要是以当前目录所在的位置开始的路径信息,如./ ../相对路径 System.out.println("文件的绝对路径信息是" + f1.getAbsolutePath()); System.out.println(f1.delete() ? "文件删除成功" : "文件删除失败"); } else { // 3、若文件不存在则创建新的空文件 System.out.println(f1.createNewFile()?"文件创建成功":"文件创建失败"); } } }
运行效果
文件的名称是:a.txt 文件的大小是:6 文件的最后一次修改时间是:2022-11-11 14:22:26 文件的绝对路径信息是d:\a.txt 文件删除成功
可以发现时间变为文件最后一次被修改的时间啦~
(4)目录操作
4.1单层目录操作
File f2 = new File("d:/qi"); if (f2.exists()) { System.out.println("目录名称是" + f2.getName()); System.out.println(f2.delete() ? "目录删除成功" : "目录删除失败"); } else { System.out.println(f2.mkdir() ? "目录创建成功" : "目录创建失败"); }
运行结束后会在D盘下出现以qi命名的目录啦~
4.2多层目录操作
public class File_Content操作 { public static void main(String[] args) { File f2 = new File("d:/q/q/^_^"); if (f2.exists()) { System.out.println("目录名称是" + f2.getName()); // System.out.println(f2.delete() ? "目录删除成功" : "目录删除失败"); } else { //创建单层目录 // System.out.println(f2.mkdir() ? "目录创建成功" : "目录创建失败"); //创建多层目录 System.out.println(f2.mkdirs()?"目录创建成功":"目录创建失败"); } } }
运行结果
显示目录创建成功,回到d盘会发现一个层级目录最里面是一个笑脸命名的文件目录^_^
如下图所示:
【我们在创建层级目录时可以直接创建,但在删除目录时,如果是空目录(单层)则直接删除,如果是多层目录只能利用delete方法从最底层递归进行删除啦~~Java官方没有提供一次删除多层目录的方法,原因之一也是为了安全进行考虑,避免误删操作,因为在代码中运行删除时不经过回收站,所以想再恢复会很难,所以如果真的需要层级一次删除多个目录时,只有我们自己再进行编写相关代码,Java官方没有提供这样的方法。】
(5)目录遍历
需求1:将指定目录下的所有内容打印出来【目录结构如下图所示】
代码如下
//实现将指定目录中的所有内容进行打印出来 File f3=new File("d:/q/q/"); //获取目录f3下的所有内容并记录到一维数组中 File[]firstArray=f3.listFiles(); //遍历数组 for (File tf:firstArray) { String name=tf.getName(); //判断是否是文件,若是则直接打印文件名称 if (tf.isFile()) { System.out.println(name); } //若是目录,则使用[ ]将目录名称括起来 if (tf.isDirectory()) { System.out.println("["+name+"]"); } }
运行效果
a.txt b.txt C.avi [^_^]
需求2:实现目录中所有内容获取的同时进行过滤
两种实现方法:
【接口类型的引用,作为方法的形参是实参的传递方式:
(1)实现类 【下面代码 1中所示】
(2)匿名类,java8中可以用lambda表达式【下面代码2所示】
匿名内部类的语法格式:接口/父类类型 引用变量名=new 接口/父类类型(){方法的重写}】
文件目录如下
代码1如下
FileFilter fileFilter = new FileFilter() { @Override public boolean accept(File pathname) { //若文件名是以.mp3结尾的,则返回True表示保留,否则返回flase就是表示丢弃 return pathname.getName().endsWith(".mp3"); } }; File[] fileArray2 = f3.listFiles(fileFilter); for (File tf : fileArray2) { System.out.println(tf); }
运行结果
d:\q\q\李荣浩-年少有为.mp3
d:\q\q\林俊杰-黑夜问白天.mp3
代码2如下【对上述代码中利用Lambda表达式】
File f3 = new File("d:/q/q/"); //Lambda表达式格式:(参数列表)->{方法体} FileFilter fileFilter=(File pathname)->{return pathname.getName().endsWith(".mp3");}; File[] fileArray2 = f3.listFiles(fileFilter); for (File tf : fileArray2) { System.out.println(tf); }
运行结果
d:\q\q\李荣浩-年少有为.mp3
d:\q\q\林俊杰-黑夜问白天.mp3
【此处采用匿名类,涉及到lambda的使用,下面是对Java中的lambda表达式的简单介绍】
(1)Lambda表达式概述:Lambda表达式是JDK1.8之后的一种语法,是一个匿名函数,是对匿名函数的简写形式,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),可以写出更简洁、更灵活的代码。
(2)Lambda表达式语法
JDK1.8之后引入的一种语法,他的写法是使用一个->
符号,箭头将Lambda表达式分为左右两部分,左边写的是实现的这个接口中的抽象方法中的形参列表,右边就是对抽象方法的处理。
实现的这个接口中的抽象方法中的形参列表 -> 抽象方法的处理
(3)Lambda表达式注意事项
Lambda表达式不是万能的,他需要函数式接口的支持;
函数式接口;
函数式接口的定义是: 只包含一个抽象方法的接口,称为函数式接口;
其实我们的Lambda表达式就是对函数式接口的一种简写方式,所以只有是函数式接口,我们才能用Lambda表达式;再换句话说,Lambda表达式需要函数式接口的支持,那函数式接口我们可以自己定义,当然JDK1.8也给我们提供了一些现成的函数式接口。
例如自定义的函数式接口:
@FunctionalInterface
public interface MyInterFace<T>{
//函数式接口中只能有一个抽象方法
void getValue(T t);
}
//自定义的函数式接口的Lambda 表达式
MyInterFace<String>face=(x)->System.out.println(x);
当然了,具体的一些Lambda的简单例子,大家可以去菜鸟上去看一下~链接如下啦~~~