File(文件类)
尽管java.io定义的大多数类是实行流式操作的,File类不是。它直接处理文件和文件系统。也就是说,File类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。此外,File还浏览子目录层次结构。很多程序中文件是数据的根源和目标。尽管它们在小应用程序中因为安全原因而受到严格限制,文件仍是存储固定和共享信息的主要资源。Java中的目录当成File 对待,它具有附加的属性——一个可以被 list( )方法检测的文件名列表。
下面的构造函数可以用来生成File 对象:
File(String pathname)
File(String parent, String child)
File(File parent, String child)
File(URI uri)
这里,parent是文件的路径名,pathname 是文件名,child 是一个一级子目录 file: URI 是一个URI
一.基本方法
如何创建File实例
1.通过文件路径(字符串)来创建File实例
比如获取桌面的路径 (绝对路径)
比如获取当前路径 (相对路径)
// 绝对路径
String dtPath = "/Users/lanou/Desktop";
// 相对路径
String dtString = "src/log4j2.xml"
2.通过路径字符串构造出File实例
File file1 = new File(dtPath);
File file2 = new File(dtString);
3.验证实例是否正确
// 采用 exists() 判断是否存在
System.out.println(file1.exists());
System.out.println(file2.exists());
4.通过父级File对象,确定子级并生成File实例
// File(File parent,String child)
// 获取File对象 并确定子级路径字符串
// dtFile | test
File testFile = new File(file1, "test");
// 生成子级File实例
// 验证实例
System.out.println(testFile.exists());
5.通过父级路径 子级路径生成File实例
File file = new File(dtPath, "test");
System.out.println(file.exists());
6.通过URI对象 生成File实例
// 1.确定目标的URI 字符串形式
String uriStr = "file:///users/xiaodong/Desktop/test";
// 2.生成目录URI对象
URI uri = null;
try {
uri = new URI(uriStr);
} catch (URISyntaxException e) {
fllog.warn("URI" + e.getMessage());
}
// 通过URI对象生成File实例
// 注: File构造器可以解析file://协议uri
File file3 = null;
try {
file3 = new File(uri);
} catch (IllegalArgumentException e) {
fllog.warn("IllegalArgumentException: " + e.getMessage());
}
System.out.println(file3.exists());
}
二.常用方法
1.判断File对象是否存在
File f1 = new File("src/log4j2.xml");
System.out.println("log4j.xml存在情况: " + f1.exists());
2.文件的大小
System.out.println("文件大小: " + f1.length())
3.空间
File dt = new File("/users/lanou/Desktop");
System.out.println("总空间: " + dt.getTotalSpace());
System.out.println("空余空间: " + dt.getFreeSpace());
System.out.println("可用空间: " + dt.getUsableSpace());
4.文件的相关判断
// 是否是文件夹
System.out.println("桌面是文件夹吗?" + dt.isDirectory());
// 是否是文件
System.out.println("xml是文件吗?" + f1.isFile());
// 获取项目根目录下.project 隐藏文件
File f = new File("./.project");
// 是否是隐藏文件
System.out.println(".project隐藏文件: " + f.isHidden());
5.是否是绝对路径
isAbsolute()
System.out.println("桌面是否是绝对路径: " + dt.isAbsolute());
6.文件本身操作
// 获取文件名
System.out.println("f1的文件名: " + f1.getName());
// 文件全名
System.out.println("f1的全名: " + f1.getPath());
// 拥有路径信息的全名
System.out.println("f1的全名: " + f1.getAbsolutePath());
// 获取父级
System.out.println("f1的父级名: " + f1.getParent());
// 返回是File的对象
System.out.println("f1的父级File: " + f1.getParentFile());
三.File文件的基础操作
1.创建文件
createNewFile();
首先获取存放文件的路径
确定有无后缀的文件名
创建目标文件
// 无后缀文件
File f1 = new File("file03","new1");
// 有后缀文件
File f2 = new File("file03","new1.txt")
boolean res = false;
try {
res = f1.createNewFile();
res = f2.createNewFile();
} catch (IOException e) {
System.out.println("IOException: 文件创建失败");
}
System.out.println("文件创建情况: " + res);
2.创建文件夹
mkdir();
获取存放文件夹的路径
确定所创文件的文件夹
创建目标文件
// 无后缀文件夹
File f3 = new File("file03","a")
// 有后缀文件夹
File f3 = new File("file03","b.big")
System.out.println("f3创建" + f3.mkdir());
System.out.println("f4创建" + f4.mkdir());
3.创建多层文件夹
private static boolean makeDirs1(File file) {
// 1.当前文件夹如果存在 直接返回 (结束该文件夹操作)
if (file.exists()) {
return false;
}
// 2.优先去处理父级文件夹 (如果父级是存在的 也会被步骤1的安全处理返回)
makeDirs1(file.getParentFile());
// 3.经过步骤2父级一定创建成功 所以可以直接创建本身
return file.mkdir();
}
四.文件夹的遍历
1.遍历文件夹的一级目录
获取目标文件
生成目标文件的夹的File对象
对其直接遍历操作
String path = "file04";
File target = new File(path);
// 获取String[]数组
String[] list = target.list();
for (String name : list) {
System.out.println(name);
}
也可以使用File类的相关方法进行遍历
File f = new File(path);
File[] files = f.listFiles();
for (File f : files) {
// 获取文件(夹)名
System.out.println(f.getName());
}
2.把文件夹下的文件及文件夹进行分类
// 可以封装成一个方法
private static String changeFile(File file) {
// 首先字符串初始化
String string = "";
if (string == "" && file.isDirectory())
// 如果是文件夹 string被赋值为dir:
string = "dir: ";
// 如果是文件夹 string被赋值为file:
if (string == "" && file.isFile())
string = "file: ";
// 如果是文件夹 string被赋值为hid:
if (string == "" && file.isHidden())
string = "hid: ";
// 返回字符串拼接
return string + file.getName();
}
3.遍历目标文件夹下的所有文件(文件及文件夹)
分析:
拿到目标文件对应的File对象
遍历该目标文件夹的一级目录
在遍历一级目录的过程中 会出现文件及文件夹(有无子目录)两种类型
对象 应该接着遍历
private static void trave(File file) {
// 如果是文件 或者是 空文件夹
if (file.isFile() || file.list().length == 0) {
return;
}
// 遍历一级目录
for (File f : file.listFiles()) {
// 直接打印一级目录的文件及文件夹
System.out.println(f.getName());
// 如果存在二级目录 递归处理
if (f.isDirectory()) {
trave(f);
}
}
}
4.通过队列方式遍历目标文件夹
// 通过队列方式遍历目标文件夹
private static Collection<File> list(File file) {
// 判断是不是文件 是不是空文件夹
if (file.isFile() || file.list().length == 0) {
return null;
}
// 拥有储存所有遍历结果的集合
Collection<File> coll = new ArrayList<>();
// 拥有具有队列功能结构的集合(储存文件夹)
// 队列功能: 先进先出(集合 | 可变)
LinkedList<File> linkedList = new LinkedList<>();
// 遍历一级目录
for (File f : file.listFiles()) {
// 将一级目录全部储存
coll.add(f);
if (f.isDirectory()) {
// 该层级遍历
linkedList.add(f);
}
}
// 通过队列结构
// 遍历的对象: 从队列中取出的第一个文件夹
// 遍历的出口: 队列为空
while (!linkedList.isEmpty()) {
File pop = linkedList.pop();
for (File f : pop.listFiles()) {
coll.add(f);
if (f.isDirectory()) {
linkedList.add(f);
}
}
}
return coll;
}
五.删除文件file
1.步骤
获取目标文件
删除目标文件
验证是否删除成功
File target = new File("file05");
boolean b = delete(target);
if (b) {
System.out.println("成功");
}else {
System.out.println("失败");
}
结论:
文件及空文件夹可以直接删除
非空文件夹不可以直接删除
2.一次性删除非空文件夹
private static boolean deleteTargetFile(File file) {
// 参数为空 需做安全处理 返回false
if (file == null)
return false;
// 文件不存在 可以直接false
if (!file.exists())
return false;
// 文件及空文件夹可以直接删除
if (file.isFile())
return file.delete();
if (file.list().length == 0)
return file.delete();
// 递归处理
try {
for (File f : file.listFiles()) {
// 遇到文件夹优先(递归处理)
if (f.isDirectory()) {
deleteTargetFile(f);
}
// 如果是文件可以直接删除
f.delete();
}
} catch (Exception e) {
// 删除是一个漫长的过程 处理可能出现的不可靠的失败情况
return false;
}
return file.delete();
}
过滤器
1.过滤器: 获取满足条件的目标文件
// File相关过滤器
// List(FilenameFilter filter)
// ListFile(FilenameFilter filter)
// ListFile(FileFilter filter)
// 获取过滤器过滤后的满足条件的File(String)数组
// 获取目标文件
File target = new File("file04");
// 获取目标文件的子目录中 满足条件的 一级文件(夹)
生成条件(过滤器对对象)
MyFilenameFilter filter = new MyFilenameFilter(".txt");
// 获取满足条件目标 (过滤的目标)
File[] names = target.listFiles(filter);
实现过滤器接口
// 实现过滤器接口
public class MyFilenameFilter implements FilenameFilter {
private String suffix;
// 将过滤功能移交给外部,使代码的延展性更强
public MyFilenameFilter(String suffix) {
this.suffix = suffix;
}
// 参数列表
// dir: file04 对应的File类型对象
// name: file04文件夹下所有一级文件(夹)的文件名
@Override
public boolean accept(File dir, String name) {
if (name.endsWith(suffix)) {
return true;
}
return false;
}
}