File类之文件&目录常用操作

发布于:2022-11-11 ⋅ 阅读:(530) ⋅ 点赞:(0)

(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的简单例子,大家可以去菜鸟上去看一下~链接如下啦~~~

Java Lambda 表达式 | 菜鸟教程 (runoob.com)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到