Java学习笔记(四)-- File类
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。File对象代表磁盘中实际存在的文件和目录。
File类静态成员变量
public static final char pathSeparatorChar
返回与系统有关的路径分隔符,返回为字符
public static final String pathSeparator
返回与系统有关的路径分隔符,返回为字符串
Windows系统返回分号 ;
如: D:\java; D:\test\test1
Linux系统返回冒号:
public static final char separatorChar
返回与系统有关的文件路径分隔符,返回为字符串
public static final String separator
Windows系统返回反斜杠\
如: D:\test\test1
Linux系统返回斜杠/
构造方法
File(String pathname)
通过给定路径字符串创建File对象实例
- String pathname:字符串的路径名
- 路径可以是文件结尾,也可以是文件夹结尾
- 路径可以是绝对路径,也可以是相对路径
- 路径可以存在,也可以不存在
- 创建File对象,只是把字符串路径封装为File对象,不考虑路径的真实存在情况
File(String parent, String child)
通过parent路径名字符串和child路径名字符串创建一个File对象实例。 父路径和子路径可以单独传入,使用起来灵活。父路径和子路径都可以变化。
File(File parent, String child)
通过parent抽象路径名和child子路径名字符串创建一个File对象实例。
- File(URI uri)
通过给定的file:URI 转换为路径名来创建一个File对象实例
常用方法
1. 获取功能方法
public String getAbsolutePath()
:返回此File的绝对路径。public String getPath()
:将此File转换为路径字称字符串。在构造函数中如何传递,则返回相应信息。public String getName()
:返回由此File表示的文件或目录的名称。public long length()
:返回由此File表示的文件的长度,以字节为单位。文件夹没有大小概念,不能获取文件夹大小,返回0。如果构造方法给出的路径不存在,返回0。
2. 判断功能方法
public boolean exists()
:此File表示的文件或目录是否实际存在。public boolean isDirectory()
:此File表示的是否为目录。public boolean isFile()
:此File表示的是否为文件。
isDirectory()和isFile如实际不存在,返回均为False。
3. 创建和删除功能方法
public boolean createNewFile() throws IOException
:当且仅当具有该名称的文件不存在时,创建一个新的空文件。创建文件的路径和名称在构造参数定义。- 文件不存在,创建文件,返回true
- 文件实际存在,不创建文件,返回false
- 此方法此能创建文件,不能创建文件夹
- 创建文件的路径必须存在,否则抛出IOException
public boolean delete()
:删除由此File表示的文件或目录。该方法将在硬盘直接删除文件/文件夹,不走回收站。- 文件/ 文件夹删除成功,返回true
- 文件夹中有内容,不会删除,返回false
- 文件/文件夹不存在,返回false
public boolean mkdir()
:创建由此File表示的目录。public boolean mkdirs()
:创建由File表示的目录,包括任何必须但不存在的父目录。
4. 目录的遍历
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件和目录。public File[] listFiles()
:返回一个File数组,表示该File目录中的所有子文件和目录。
在构造方法中给出的目录路径不存在,或都给出的是一个文件,则返加Null。
带Filter过滤器参数的遍历。通过实现FilenameFilter和FileFilter 接口,返回遍历目录中需要返回的文件或文件目录
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
5. 过滤器接口
java.io.Filefilter
接口:用于抽象路径名(File对象)的过滤器过滤文件
接口方法:boolean accept(File pathname)
判断指定的抽象路径名(File对象)是否应该包含在返回的文件路径名列表中
参数:
File pathname:是使用ListFiles方法遍历目录时,得到的每一个文件对象
java.io.FilenameFilter
接口:实现此接口的类用于过滤文件
接口方法:boolean accept(File dir, String name)
判断指定的文件是否应该包含在返回的文件路径名列表
参数:
File dir:File构造方法中传递的被遍历的目录
String name:使用list或listFiles方法遍历目录,获取的每一个文件/文夹的名称
代码示例
1. 例:以回归调用方式遍历目录并打印如下格式
|-Project
|-ConsoleApplication1
|-.vs
|-ConsoleApplication1
|-v14
|-.suo
|-ConsoleApplication1
|-App.config
|-bin
|-Debug
|-ConsoleApplication1.exe
|-ConsoleApplication1.exe.config
|-ConsoleApplication1.pdb
|-ConsoleApplication1.vshost.exe
|-ConsoleApplication1.vshost.exe.config
|-ConsoleApplication1.vshost.exe.manifest
|-ConsoleApplication1.csproj
|-Cryptography.cs
|-obj
代码
import java.io.File;
public class Test {
public static void main(String[] args) {
File file=new File("D:\\Project");
printDir(0,file);
}
//回归方法打印目录, level参数控制打印格式缩进
public static void printDir(int level,File file){
if (file.exists()) {
for (int i = 0; i < level; i++) {
System.out.print("\t");
}
System.out.println("|-" + file.getName());
level++;
if (file.isDirectory()) {
for (File f1 : file.listFiles()) {
printDir(level, f1);
}
}
}
}
}
2. 例:文件搜索,遍历文件夹,打印文件后缀为.java的文件
- 常用方式,通过判断文件名是否以.java结尾
import java.io.File;
public class FindFileTest {
public static void main(String[] args) {
File file=new File("D:\\Project\\JavaStudy");
findFile(file,".Java");
}
public static void findFile(File file, String exeName) {
if (file.exists()) {
if (file.isDirectory()) {
for (File f1 : file.listFiles()) {
findFile(f1, exeName);
}
} else {
if (file.getName().toLowerCase().endsWith(exeName.toLowerCase())) {
System.out.println(file.getAbsoluteFile());
}
}
}
}
}
-
使用FileFilter 过滤器查找文件
1) 使用实现FileFilter接口的类FileFilterImpl
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
private String exeName;
public FileFilterImpl(String exeName){
this.exeName=exeName;
}
@Override
public boolean accept(File pathname) {
//返回符合要求的文件或文件夹
//1. 如果找到的File是目录,允许返回以遍历该目录下的文件
//2. 如果找到的File是文件,且文件名以exeName结尾,则返回
return pathname.isDirectory()||(pathname.isFile()&&pathname.getName().toLowerCase().endsWith(this.exeName.toLowerCase()));
}
}
import java.io.File;
public class FindFileTest2 {
public static void main(String[] args) {
File file=new File("D:\\Project\\JavaStudy");
findFile(file,".Java");
}
public static void findFile(File file, String exeName) {
if (file.exists()) {
//通过实现FileFilter接口的FileFilterImpl类,进行遍历筛选查找出的该目录下符合要求的文件或文件夹
if (file.isDirectory()) {
File[] files=file.listFiles(new FileFilterImpl(exeName));
for (File f1 : files) {
findFile(f1, exeName);
}
} else {
System.out.println(file.getAbsoluteFile());
}
}
}
}
2)使用匿名内部类方式
import java.io.File;
import java.io.FileFilter;
public class FindFileTest3 {
public static void main(String[] args) {
File file=new File("D:\\Project\\JavaStudy");
findFile(file,".Java");
}
public static void findFile(File file, String exeName) {
if (file.exists()) {
if (file.isDirectory()) {
//使用匿名内部类
File[] files=file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory()||(pathname.isFile()&&pathname.getName().toLowerCase().endsWith(exeName.toLowerCase()));
}
});
for (File f1 : files) {
findFile(f1, exeName);
}
} else {
System.out.println(file.getAbsoluteFile());
}
}
}
}
3)使用Lambda表达式
import java.io.File;
import java.io.FileFilter;
public class FindFileTest4 {
public static void main(String[] args) {
File file=new File("D:\\Project\\JavaStudy");
findFile(file,".Java");
}
public static void findFile(File file, String exeName) {
if (file.exists()) {
if (file.isDirectory()) {
//使用Lambda方式
/* 方式1
File[] files=file.listFiles((File pathname)-> {
return pathname.isDirectory()||(pathname.isFile()&&pathname.getName().toLowerCase().endsWith(exeName.toLowerCase()));
}
);
*/
//方式2 只有一个参数时简化
File[] files=file.listFiles(pathname->pathname.isDirectory()||(pathname.getName().toLowerCase().endsWith(exeName.toLowerCase())));
for (File f1 : files) {
findFile(f1, exeName);
}
} else {
System.out.println(file.getAbsoluteFile());
}
}
}
}
- 使用FilenameFilter过滤器接口
import java.io.File;
import java.io.FilenameFilter;
public class FindFileTest5 {
public static void main(String[] args) {
File file=new File("D:\\Project\\JavaStudy");
findFile(file,".Java");
}
public static void findFile(File file, String exeName) {
if (file.exists()) {
if (file.isDirectory()) {
//方式1 使用匿名内部类
/*
File[] files=file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File searchFile=new File(dir,name);
return searchFile.isDirectory()||(searchFile.isFile()&&name.toLowerCase().endsWith(exeName.toLowerCase()));
}
});
*/
// 方式2 使用Lambda方式
File[] files=file.listFiles((File dir, String name)-> {
File searchFile=new File(dir,name);
return searchFile.isDirectory()||(searchFile.isFile()&&name.toLowerCase().endsWith(exeName.toLowerCase()));
}
);
for (File f1 : files) {
findFile(f1, exeName);
}
} else {
System.out.println(file.getAbsoluteFile());
}
}
}
}