File类
1.0 概述
java.io.File 文件和目录路径名的抽象表示形式,java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作。
1.1 字段
static String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。static String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
public static void main(String[] args) {
String pathSeparator = File.pathSeparator;
System.out.println(pathSeparator);//路径分隔符 windows:分号; linux:冒号:
String separator = File.separator;
System.out.println(separator); // 文件名称分隔符 windows:反斜杠\ linux:正斜杠/
String path = "dd"+File.separator +"d.java";
System.out.println(path); // dd\d.java
}
1.2 构造方法
- public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
- public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
- public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
- 构造举例,代码如下:
public static void main(String[] args) {
// 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
File file = new File("D:\\cc\\a.txt");
// 从父路径名字符串和子路径名字符串创建新的 File实例。
String parent_path = "D:\\cc";
File file1 = new File(parent_path, "b.txt");
// 从父抽象路径名和子路径名字符串创建新的 File实例。
File parent_dir = new File("D:\\cc");
String child = "c.txt";
new File(parent_dir,child);
}
小贴士:
1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
1.3 常用方法
获取功能的方法
- public String getAbsolutePath() :返回此File的绝对路径名字符串。
- public String getPath() :将此File转换为路径名字符串。
- public String getName() :返回由此File表示的文件或目录的名称。
- public long length() :返回由此File表示的文件的长度。
- public String getParent() :返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回
null
。 -
方法演示代码
public static void main(String[] args) {
// 创建一个文件对象
File f = new File("D://aa/bbb.java");
System.out.println("文件的绝对路径:"+f.getAbsolutePath()); // 文件的绝对路径:D:\aa\bbb.java
System.out.println("文件构造路径:"+f.getPath()); // 文件构造路径:D:\aa\bbb.java
System.out.println("文件名称:"+f.getName()); // 文件名称:bbb.java
System.out.println("文件大小:"+f.length()+"字节"); // 文件大小:0字节
System.out.println("文件的父路径:"+f.getParent()); //文件的父路径:D:\aa
File f2 = new File("D://aa/bb/cc");
System.out.println("目录的绝对路径:"+f2.getAbsolutePath()); //目录的绝对路径:D:\aa\bb\cc
System.out.println("目录构造路径:"+f2.getPath()); //目录构造路径:D:\aa\bb\cc
System.out.println("目录名称:"+f2.getName()); //目录名称:cc
System.out.println("目录大小:"+f2.length()+"字节"); //目录大小:0字节
System.out.println("目录的父路径:"+f2.getParent()); // 目录的父路径:D:\aa\bb
}
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
判断功能的方法
- public boolean exists() :此File表示的文件或目录是否实际存在。
- public boolean isDirectory() :此File表示的是否为目录。
- public boolean isFile() :此File表示的是否为文件。
public static void main(String[] args) {
// 创建文件对象
File f = new File("D:\\aa\\bbb.java");
File f2 = new File("D:\\aa\\cc");
// 判断是否存在
System.out.println("D://aa/bbb.java 是否存在:"+f.exists()); // D://aa/bbb.java 是否存在:true
System.out.println("D://aa/cc 是否存在:"+f2.exists()); // D://aa/bbb.java 是否存在:true
// 判断是文件还是目录 (必须存在)
System.out.println("D://aa/bbb.java 是文件:"+f.isFile()); //D://aa/bbb.java 是文件:true
System.out.println("D://aa/cc 是目录:"+f2.isDirectory()); // D://aa/cc 是目录:true
}
创建删除功能的方法
- public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
- public boolean delete() :删除由此File表示的文件或目录。
- public boolean mkdir() :创建由此File表示的目录。
- public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
- public boolean renameTo(File dist): 重新命名此抽象路径名表示的文件。
package com.long123.File;
import java.io.File;
import java.io.IOException;
public class FileDemo4 {
public static void main(String[] args) throws IOException {
// 文件的创建
File f = new File("aa.txt");
if(!f.exists()){
System.out.println("文件是否创建:"+f.createNewFile()); // 文件是否创建:true
}
// 目录创建
File f2 = new File("newDir");
if (!f2.exists()){ // 如果目录不存在
System.out.println("目录是否创建:"+f2.mkdir()); //目录是否创建:true
}
// 创建多级目录
File f3 = new File("newDir\\a\\b");
System.out.println("是否创建成功:"+f3.mkdirs()); //是否创建成功:true
// b不会被当作目录创建
// 文件的删除
System.out.println(f.delete()); // true
// 目录的删除
System.out.println(f3.delete()); // false
}
}
API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。
1.4 目录遍历
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
- public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
public static void main(String[] args) throws IOException {
File f = new File("D:\\aa");
// 获取当前目录下的文件及文件夹的名称
String[] names = f.list();
if (names != null){
for (String name : names){
System.out.println(name);
}
}
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files = f.listFiles();
for (File file:files) {
System.out.println(file);
}
}
小贴士:
调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
递归打印多级目录
package com.long123.File;
import java.io.File;
import java.io.IOException;
public class FileDemo6 {
public static void main(String[] args) throws IOException {
File file = new File("D://aa");
printDir(file);
}
public static void printDir(File dir){
// 获取子文件和目录
File[] files = dir.listFiles();
/*
如果是目录:继续调用printDir()
如果是文件:打印文件的绝对路径
* */
for (File file:files) {
if(file.isFile()){
// 是文件,打印绝对路径
System.out.println(file.getAbsolutePath());
}else {
// 是目录 ,打印绝对路径,继续往下查找
System.out.println(file.getAbsolutePath());
printDir(file);
}
}
}
}
File过滤器
-
public File[] listFiles(FileFilter
filte)
-
public File[] listFiles(
FilenameFilter filter
)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:
File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名。
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
过滤以.java结尾的文件
// FilterImpl 实现FilteFile接口
import java.io.File;
import java.io.FileFilter;
public class FilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
// 如果是个目录 继续找
if (pathname.isDirectory())
return true;
// 判断是否有.java
return pathname.getName().toLowerCase().endsWith(".java");
}
}
package com.long123.File;
import java.io.File;
import java.io.IOException;
public class FileDemo7 {
public static void main(String[] args) throws IOException {
File file = new File("D://aa");
printDir(file);
}
public static void printDir(File dir){
// 获取子文件和目录 // 过滤器
File[] files = dir.listFiles(new FilterImpl());
/*
如果是目录:继续调用printDir()
如果是文件:打印文件的绝对路径
* */
for (File file:files) {
if(file.isFile()){
// 是文件,打印绝对路径
System.out.println(file.getAbsolutePath());
}else {
// 是目录 ,打印绝对路径,继续往下查找
// System.out.println(file.getAbsolutePath());
printDir(file);
}
}
}
}
内部类实现
package com.long123.File;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class FileDemo8 {
public static void main(String[] args) throws IOException {
File file = new File("D://aa");
printDir(file);
}
public static void printDir(File dir){
// 获取子文件和目录 // 过滤器 内部类
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// 如果是个目录 继续找
if (pathname.isDirectory())
return true;
// 判断是否有.java
return pathname.getName().toLowerCase().endsWith(".java");
}
});
/*
如果是目录:继续调用printDir()
如果是文件:打印文件的绝对路径
* */
for (File file:files) {
if(file.isFile()){
// 是文件,打印绝对路径
System.out.println(file.getAbsolutePath());
}else {
// 是目录 ,打印绝对路径,继续往下查找
// System.out.println(file.getAbsolutePath());
printDir(file);
}
}
}
}
lambda 实现
package com.long123.File;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class FileDemo9 {
public static void main(String[] args) throws IOException {
File file = new File("D://aa");
printDir(file);
}
public static void printDir(File dir){
// 获取子文件和目录 // 过滤器 内部类
File[] files = dir.listFiles(pathname->
pathname.getName().endsWith(".java") || pathname.isDirectory()
);
/*
如果是目录:继续调用printDir()
如果是文件:打印文件的绝对路径
* */
for (File file:files) {
if(file.isFile()){
// 是文件,打印绝对路径
System.out.println(file.getAbsolutePath());
}else {
// 是目录 ,打印绝对路径,继续往下查找
// System.out.println(file.getAbsolutePath());
printDir(file);
}
}
}
}