IO学习之File类

在IO流的学习过程中,我们经常会对文件的内容进行读取和写入操作,而平时运行一些应用程序时,也经常会对文件本身进行一些操作,诸如新建或删除一个文件,查询文件大小等等。

针对文件的这类操作,JDK中提供了一个File类,该类封装了一个路径,并提供了一系列用于操作该路径下文件的方法。下面我们直接通过代码来了解FIle类的几个常用的方法。

一、 常用方法

我们先在当前工程目录下创建一个file文件夹,在该文件夹下创建一个hello.txt文件并输入“hello中国”,然后运行以下代码:

package com.liao.IOTest0820;

import java.io.File;

public class FileMethods {
	public static void main(String[] args) {
		// 通过相对路径创建一个file文件
		File file = new File("file\\hello.txt");
		// 获取文件名称
		System.out.println("文件名称:" + file.getName());
		// 获取文件目录(父路径)
		System.out.println("文件父路径:" + file.getParent());
		// 获取文件相对路径
		System.out.println("文件相对路径:" + file.getPath());
		// 获取文件绝对路径
		System.out.println("文件绝对路径:" + file.getAbsolutePath());
		// 获取文件大小(byte)
		System.out.println("文件大小:" + file.length());
		// 判断文件是否存在
		System.out.println("文件是否存在:" + file.exists());
		// 判断是否为文件
		System.out.println("是否为一个文件:" + file.isFile());
		// 判断是否为目录
		System.out.println("是否为一个目录:" + file.isDirectory());
		// 判断是否为绝对路径
		System.out.println("是否为绝对路径:" + file.isAbsolute());
		// 判断文件是否可读
		System.out.println("是否可读:" + file.canRead());
		// 判断文件是否可写
		System.out.println("是否可写:" + file.canWrite());
		// 获取文件最后修改时间(距时间戳的毫秒数)
		System.out.println("最后修改时间:" + file.lastModified());
	}
}

执行上述代码,得到输出结果如下:

通过上述方法,我们可以获取该文件的一些基本有用信息。下面,我们再了解一下文件目录的遍历。

二、 遍历目录下的文件

这里我们重点了解两个方法:list( )和listfiles( )

list( )方法:     返回一个字符串数组(String [ ]),这些字符串表示目录下的文件和目录名,

listfiles( )方法: 返回一个抽象路径名数组(File [ ]),这些路径名表示此目录下的文件。

值得注意的是,遍历一个文件目录之前,我们最好先调用File类的isDirectory()方法对该路径下的文件进行一个判断,如果是目录的话,我们再调用list()方法;如果是文件的话,调用list()方法会报空指针异常。

三、 文件过滤器

通过调用list( )方法,我们可以获得一个目录下的所有文件,但有时候我们仅仅需要得到特定类型的文件,如txt文件,class文件等等,这时我们就需要用到文件过滤器,用来获得指定类型的文件。

针对这种需求,java 里提供了一个重载了的list(FilenameFilter  filter)的方法,该方法接收一个FilenameFilter 类型的参数。FilenameFilter 是一个接口,被称作文件过滤器,其中定义了一个抽象方法accept(File dir ,String name )

当我们调用list(FilenameFilter  filter)方法时,就需要实现FilenameFilter接口,并对accept( )方法进行重写,通过 accept()方法指定文件类型,从而文件过滤目的。

值得注意的是,accept( )方法的返回值类型为boolean类型,如果返回结果为true,则该文件将会被加入到数组中,如果为false,则不添加。

四、 文件(目录)的删除

File类中提供了一个文件删除的方法delete(),通过调用delete()方法可以对文件或目录进行删除操作。不过,有一点值得注意,如果一个目录不为空(存在子目录或文件),则delete()操作无效。这时需要先删除该目录下所有文件(子目录),然后才能删除该目录。

下面我们通过一个简单的例子来加深对上述三种操作的认识。

package com.liao.IOTest0820;

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

public class FileOperate {
	private static FilenameFilter filter;

	public static void main(String[] args) {
		// 创建文件夹
		File parentFile = new File("fileTest");
		// 文件夹不存在则新建文件夹
		if (!parentFile.exists()) {
			parentFile.mkdir();
		}
		// 生成txt文件
		creatFile(".txt");
		//生成java文件
		creatFile(".java");

		// 文件过滤器
		filter = new FilenameFilter() {
			//重写accept( )方法
			@Override
			public boolean accept(File dir, String name) {
				//创建File对象
				File file = new File(dir, name);
				//判断是否为后缀名为.java的文件
				if (file.isFile() && name.endsWith(".java")) {
					return true;
				} else {
					return false;
				}
			}
		};
		// 输出所有.java文件
		String[] names = parentFile.list(filter);
		for (String name : names) {
			System.out.println(name);
		}

		// 删除文件及目录
		deleteFile(parentFile);
	}
	//文件生成方法,接收一个文件类型参数
	private static void creatFile(String type) {
		for (int i = 0; i < 5; i++) {
			String name = "fileTest\\" + i + type;
			File file = new File(name);
			//判断文件是否存在
			if (!file.exists()) {
				try {
					file.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private static void deleteFile(File dir) {
		if (dir.exists()) {// 文件是否存在
			// 获取文件目录
			File[] files = dir.listFiles(filter);
			// 遍历文件
			for (File file : files) {
				// 判断是否为文件夹
				if (file.isDirectory()) {
					//如果为文件夹,递归调用deleteFile()方法
					deleteFile(file);
				} else {
					//删除文件
					file.delete();
				}
			}
		}
	}
}

通过上面的学习,我们对File类有了一些基本的认识,小结如下:

1、获取文件基本信息,如文件名,路径,大小等,这里需重点注意一下相对路径与绝对路径;

2、遍历目录下的文件,list(  )和listfiles(  ),使用前注意先判断是否为目录;

3、文件过滤器,实现list()方法下的FilenameFilter接口,重写accept()方法;

4、文件(目录)的删除,调用delete()方法,注意删除非空目录时须先删除该目录下所有文件。

 

 

 

猜你喜欢

转载自blog.csdn.net/LIAO_7053/article/details/81940835