Java - IO - File类
## File类
java.io.File类,文件和目录路径名的抽象表示形式。
Java把电脑中的文件和目录封装成一个File类,让我们可以通过File类进行文件操作。
关键词:file、directory、path
路径path
-
绝对路径:是一个完整的路径
- 以盘符(C: D:)开始的路径
- D:\IdeaProjects\IO操作\test.txt
- 以盘符(C: D:)开始的路径
-
相对路径:是一个简化的路径
- 相对是指相对于当前项目的根目录
- D:\IdeaProjects\IO操作\test.txt --> 简化: test.txt
- 默认到根目录下寻找
注意:
-
路径是不分大小写的
-
window系统下,文件名分隔符用反斜杠\ ,与转义符号冲突,需要用
两个反斜杠\\表示一个普通的反斜杠\
-
如
D:\\IdeaProjects\\IO操作\\test.txt
静态变量
Modifier and Type | Field and Description |
---|---|
static String |
pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。 |
static char |
pathSeparatorChar 与系统相关的路径分隔符。 |
static String |
separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。 |
static char |
separatorChar 与系统相关的默认名称分隔符。 |
package file;
import java.io.File;
public class TestFile {
public static void main(String[] args) {
/*
File 类的有关静态变量
pathSeparator 路径分割符,不如在装jdk环境变量时,不同路径用分号隔开
window用分号; linux用冒号:
separator 文件名称分割符
window用反斜杠\ linux用正斜杆/
*/
// 原始的是char型
System.out.println(File.pathSeparatorChar);
System.out.println(File.separatorChar);
// ""+原始 得到字符串型
System.out.println(File.pathSeparator);
System.out.println(File.separator);
}
}
可知不同的操作系统路径表示是不一样的,未来的开发中,为了兼容不同系统,应该先获取separator再拼接路劲,不能把路径写死!
构造方法
Constructor and Description |
---|
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File 实例。 |
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File 实例。 |
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File 实例。 |
File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File 实例。 |
参数pathname:字符串的路径名称
路径可以以文件结尾,也可以是文件夹结尾
路径可以是相对路径,也可以是绝对路径
路径可以是存在的,也可以不存在!
创建File对象,只是把字符串路径封装成File对象,不考虑路径的真假。
常用方法
判断功能
public boolean exists()
此File表示的文件或目录是否存在。public boolean isDirectory()
此File表示的文件是否为目录。public boolean isFile()
此File表示的文件是否为普通文件。
创建删除功能
public boolean createNewFile()
当且仅当具有该名称的文件尚不存在时,创建一个File空文件
。public boolean delete()
删除由此File表示的文件/目录。public boolean mkdir()
创建由此File表示的目录。(单级)public boolean mkdirs()
创建由此File表示的目录,包括任何必需但不存在的父目录。(可多级)
获取功能
public String getAbsolutePath()
返回此File的绝对路径名字符串。public String getPath()
将此File转换为路径名字符串。public String getName()
返回由此File表示的文件或目录的名称。public long length()
返回由此File表示的文件的长度。
目录的遍历
public String[] list()
返回一个String数组,表示该File目录中的所有子文件/目录public File[] listFiles()
返回一个File数组,表示该File目录中的所有子文件/目录的抽象File
package file;
import java.io.File;
/**
* 通过递归打印多级目录
*/
public class DirectoryTraversal {
public static void main(String[] args) {
File file = new File("aaa");
getAllFile(file);
}
public static void getAllFile(File dir) {
System.out.println(dir.getAbsolutePath());
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath());
} else {
getAllFile(file);
}
}
}
}
文件
文件搜索
在目录遍历的基础上筛选某些类型的文件
package file;
import java.io.File;
/**
* 通过递归打印多级目录
* 同时筛选.java文件
*/
public class SearchFile {
public static void main(String[] args) {
File file = new File("D:\\IdeaProjects\\IO操作");
getAllFile(file);
}
public static void getAllFile(File dir) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
// 只打印以 .java结尾的文件
String name = file.getName();
name = name.toLowerCase();// 不区分大小写
if (name.endsWith(".java")) {
System.out.println(file.getAbsolutePath());
}
} else {
getAllFile(file);
}
}
}
}
只需要打印之前进行一些判断即可。
使用过滤器进行搜索
返回值 | 描述 |
---|---|
File[] |
listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
File[] |
listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
查看官方文档,FileFilter是一个接口,只定义了一个accept抽象方法,没有实现类!!需要自己编写实现类
过滤器实现类
package file;
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
// 过滤标识
private String str;
public FileFilterImpl() {
str = ".java";
}
public FileFilterImpl(String str) {
this.str = str;
}
@Override
public boolean accept(File pathname) {
/*
过滤以.java结尾的文件
注意!如果是目录也需要返回,否则将无法递归遍历多级目录
*/
if (pathname.isDirectory()) {
return true;
}
return pathname.getName().toLowerCase().endsWith(str);
}
}
优化后的文件搜索
package file;
import java.io.File;
public class SearchFile2 {
public static void main(String[] args) {
File file = new File("D:\\IdeaProjects\\IO操作");
getAllFile(file);
}
public static void getAllFile(File dir) {
// 通过过滤器筛选 .class结尾的文件
File[] files = dir.listFiles(new FileFilterImpl(".class"));
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath());
} else {
getAllFile(file);
}
}
}
}
解释
- 优化后的代码
File[] files = dir.listFiles(new FileFilterImpl(".class"));
- dir.listFiles首先遍历dir目录下的所有子文件或目录,将它们封装成File对象
- 然后调用参数传递的过滤器中的accept方法
- accept的参数pathname就是之前遍历dir目录时封装的每一个File对象
- accept返回true就将File对象添加到File[ ] 数组中,否则不加入。
匿名内部类实现过滤器
package file;
import java.io.File;
import java.io.FileFilter;
/**
* 使用匿名内部类实现过滤器
*/
public class SearchFile3 {
public static void main(String[] args) {
File file = new File("D:\\IdeaProjects\\IO操作");
getAllFile(file);
}
public static void getAllFile(File dir) {
// 通过过滤器筛选 .java结尾的文件
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
}
});
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath());
} else {
getAllFile(file);
}
}
}
}
使用lambda表达式
package file;
import java.io.File;
import java.io.FileFilter;
/**
* 使用lambda表达式函数式接口
*/
public class SearchFile4 {
public static void main(String[] args) {
File file = new File("D:\\IdeaProjects\\IO操作");
getAllFile(file);
}
public static void getAllFile(File dir) {
// 通过过滤器筛选 .java结尾的文件
File[] files = dir.listFiles((File pathname)->{
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
});
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath());
} else {
getAllFile(file);
}
}
}
}
FilenameFilter也和FlieFilter差不多
注意一下参数的类型即可,dir是根目录,name是文件名
package java.io;
/**
* Instances of classes that implement this interface are used to
* filter filenames. These instances are used to filter directory
* listings in the <code>list</code> method of class
* <code>File</code>, and by the Abstract Window Toolkit's file
* dialog component.
*
* @author Arthur van Hoff
* @author Jonathan Payne
* @see java.awt.FileDialog#setFilenameFilter(java.io.FilenameFilter)
* @see java.io.File
* @see java.io.File#list(java.io.FilenameFilter)
* @since JDK1.0
*/
@FunctionalInterface
public interface FilenameFilter {
/**
* Tests if a specified file should be included in a file list.
*
* @param dir the directory in which the file was found.
* @param name the name of the file.
* @return <code>true</code> if and only if the name should be
* included in the file list; <code>false</code> otherwise.
*/
boolean accept(File dir, String name);
}
lambda表示形式
package file;
import java.io.File;
/**
* 使用lambda表达式函数式接口
*/
public class SearchFile5 {
public static void main(String[] args) {
File file = new File("D:\\IdeaProjects\\IO操作");
getAllFile(file);
}
public static void getAllFile(File dir) {
// 通过FilenameFilter过滤器筛选 .java结尾的文件
File[] files = dir.listFiles((File d, String name)->{
return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
});
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath());
} else {
getAllFile(file);
}
}
}
}
lambda简化
File[] files = dir.listFiles(
pathname->pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java")
);