File类
File类概述
File类 : 计算机中所有文件和文件夹的类
背景知识
绝对路径 vs 相对路径:
1.绝对路径:是完整的路径,以盘符开头!(可以这么记:因为是完整的路径,所以“绝对”能找到-->绝对路径)
2.相对路径:以参照物为原点,从原点的路径内寻找文件或者文件夹
--->不以盘符开头!
注意:
1)IDEA和Eclipse软件的相对路径起点是Project
2)IDEA和Eclipse软件因为项目结构有区别,所以使用相对路径的方式也不同:
IDEA最外层是Project,一个Project里面可以有多个module,因为起点是Project,所以可以访问不同的module里的文件或者文件夹
Eclipse最外层是workspace,一个workspace里面可以有多个Project,因为起点是Project,所以使用相对路径去访问的话,只能访问本Project内的资源
\\ 和 /:
欲访问的地址:
C:\Users\lenovo\Pictures\Saved Pictures\1.jpg
则不能有单个\,而应该用\\ 或者 / 去表示原来的“\”
File类的自定义常量
问题描述:
看File类中的四个自定义常量都是啥
解决办法:
File类的四个自定义常量:
1.static String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
-->File.pathSeparator = ;
2.static char pathSeparatorChar
与系统有关的路径分隔符。
-->File.pathSeparatorChar = ;
3.static String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
-->File.separator = \
4.static char separatorChar
与系统有关的默认名称分隔符。
-->File.separatorChar = \
代码示例
package com.tan.file;
import java.io.File;
public class File {
public static void main(String[] args) {
File file1 = new File("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\1.jpg");
File file2 = new File("C:\\Users\\lenovo\\Pictures","\\Saved Pictures\\1.jpg");
File file3 = new File(new File("C:\\Users\\lenovo\\Pictures"),"\\Saved Pictures\\1.jpg");
System.out.println("File.pathSeparator = " + File.pathSeparator);
System.out.println("File.pathSeparatorChar = " + File.pathSeparatorChar);
System.out.println("File.separator = " + File.separator);
System.out.println("File.separatorChar = " + File.separatorChar);
}
}
File类的构造方法
问题描述:
创建File对象
解决办法:
File类的四个构造方法:
1.File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
-->以父路径和子路径的形式去表示文件/文件夹路径进而将该File对象执行该文件/文件夹 (父路径是用File对象的形式表示)
2.File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
-->传入一个文件/文件夹的路径,让File对象指向这个文件/文件夹
3.File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
-->以父路径和子路径的形式去表示文件/文件夹路径进而将该File对象执行该文件/文件夹 (父/子路径都是用String表示)
4.File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
-->传入一个URI,而URI转换为一个抽象路径名,进而使该File对象执行该抽象路径名末尾的文件或者文件夹
注意:File对象的创建,File只指向路径结尾的文件和文件夹,而不是整个路径!!
创建File对象的时候发生了什么:
1. 创建了File对象
2. 开辟了内存空间
3. 让file对象指向了路径结尾的文件/文件夹
!!若文件不存在,则创建新文件
代码示例
package com.tan.file;
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
File file1 = new File("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\1.jpg");
File file2 = new File("C:\\Users\\lenovo\\Pictures","\\Saved Pictures\\1.jpg");
File file3 = new File(new File("C:\\Users\\lenovo\\Pictures"),"\\Saved Pictures\\1.jpg");
System.out.println("file1 = " + file1);
System.out.println("file2 = " + file2);
System.out.println("file3 = " + file3);
}
}
File类的成员方法
File类的创建功能
File类的创建功能:
1. boolean mkdir()
创建此抽象路径名指定的目录。
-->作用:创建单层文件夹
2. boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
-->较为重要
-->作用:创建单层文件夹或者多层文件夹
3. boolean createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
-->较为重要
-->作用:创建文件
-->注意:
1)若文件不存在则创建
2)若文件存在则创建失败
具体代码实现
package com.tan.file;
/*
File类的创建功能:
1. boolean mkdir()
创建此抽象路径名指定的目录。
-->作用:创建单层文件夹
2. boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
-->较为重要
-->作用:创建单层文件夹或者多层文件夹
3. boolean createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
-->较为重要
-->作用:创建文件
-->注意:
1)若文件不存在则创建
2)若文件存在则创建失败
*/
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\lenovo\\Desktop\\单层文件夹");
System.out.println("file.mkdir() = " + file.mkdir());
File file1 = new File(file,"多层文件夹");
System.out.println("file1.mkdirs() = " + file1.mkdirs());
File file2 = new File("C:\\Users\\lenovo\\Desktop\\文件.jpg");
file2.createNewFile();
System.out.println(" -------------------------------- ");
/*
使用相对路径去创建文件:
1.txt在与Module_TAN并行的位置被创建
2.txt在与src并行的位置被创建
3.txt在与FileDemo类.java文件并行的位置被创建
注释:Module_TAN是模块
*/
File file5 = new File("1.txt");
file.createNewFile();
File file6 = new File("Module_TAN\\2.txt");
file6.createNewFile();
File file7 = new File("Module_TAN\\src\\com\\tan\\file\\3.txt");
file7.createNewFile();
}
}
File类的删除功能
boolean delete()
删除此抽象路径名表示的文件或目录。
--->慎用!该方法一旦使用,就没有还原文件/文件夹的方法了,就是彻底删除了
File类的获取功能
重要:
String getName() : 获取文件/文件夹的名称
long length() : 获取文件的大小(所占字节数)
了解:
1.1 File getAbsoluteFile()
返回此抽象路径名的绝对路径名形式。
-->以File对象的形式返回file对象指向的文件/文件夹的绝对路径
1.2 String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
-->以字符串对象的形式返回file对象指向的文件/文件夹的绝对路径
2.1 String getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
-->以字符串的形式返回file对象指向的文件/文件夹的父路径
2.2 File getParentFile()
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
-->以File对象的形式返回file对象指向的文件/文件夹的父路径
3.1 String getPath()
将此抽象路径名转换为一个路径名字符串。
-->获取创建File对象时,传入的文件/文件夹的路径(File类的toString方法内部就是在调用getPath)
4.1 long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。
--> 获取File对象指向的文件/文件夹最后一次修改的时间 -> 毫秒值
具体代码实现
package com.tan.file;
import java.io.File;
/*
1.1 File getAbsoluteFile()
返回此抽象路径名的绝对路径名形式。
-->以File对象的形式返回file对象指向的文件/文件夹的绝对路径
1.2 String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
-->以字符串对象的形式返回file对象指向的文件/文件夹的绝对路径
2.1 String getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
-->以字符串的形式返回file对象指向的文件/文件夹的父路径
2.2 File getParentFile()
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
-->以File对象的形式返回file对象指向的文件/文件夹的父路径
3.1 String getPath()
将此抽象路径名转换为一个路径名字符串。
-->获取创建File对象时,传入的文件/文件夹的路径(File类的toString方法内部就是在调用getPath)
4.1 long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。
--> 获取File对象指向的文件/文件夹最后一次修改的时间 -> 毫秒值
*/
public class FileDemo {
public static void main(String[] args) {
File file = new File("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\1.jpg");
/*
file.getAbsoluteFile() = C:\Users\lenovo\Pictures\Saved Pictures\1.jpg
file.getAbsolutePath() = C:\Users\lenovo\Pictures\Saved Pictures\1.jpg
*/
System.out.println("file.getAbsoluteFile() = " + file.getAbsoluteFile());
System.out.println("file.getAbsolutePath() = " + file.getAbsolutePath());
/*
file.getParent() = C:\Users\lenovo\Pictures\Saved Pictures
file.getParentFile() = C:\Users\lenovo\Pictures\Saved Pictures
*/
System.out.println("file.getParent() = " + file.getParent());
System.out.println("file.getParentFile() = " + file.getParentFile());
/*
file.getPath() = C:\Users\lenovo\Pictures\Saved Pictures\1.jpg
*/
System.out.println("file.getPath() = " + file.getPath());
/*
file.lastModified() = 1644743545563
*/
System.out.println("file.lastModified() = " + file.lastModified());
}
}
File类的判断功能
boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
--->较为常用
--->判断File对象指向的文件/文件夹是否存在
boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。
--->判断创建File对象时传入的是否是绝对路径
boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
--->较为常用
--->判断File对象指向的文件/文件夹是否是文件夹
boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
--->较为常用
--->判断File对象指向的文件/文件夹是否是文件
boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。
--->判断file对象指向的文件/文件夹是否是隐藏文件/文件夹
具体代码实现
package com.tan.file;
import java.io.File;
/*
boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
--->较为常用
--->判断File对象指向的文件/文件夹是否存在
boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。
--->判断创建File对象时传入的是否是绝对路径
boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
--->较为常用
--->判断File对象指向的文件/文件夹是否是文件夹
boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
--->较为常用
--->判断File对象指向的文件/文件夹是否是文件
boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。
--->判断file对象指向的文件/文件夹是否是隐藏文件/文件夹
*/
public class FileDemo {
public static void main(String[] args) {
File file = new File("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\1.jpg");
System.out.println("file.exists() = " + file.exists());//true
System.out.println("file.isDirectory() = " + file.isDirectory());//false
System.out.println("file.isFile() = " + file.isFile());//true
System.out.println("file.isAbsolute() = " + file.isAbsolute());//true
System.out.println("file.isHidden() = " + file.isHidden());//false
}
}
遍历文件夹
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
-->把一个文件夹中所有的文件/文件夹获取到,存入到File[]数组中(只能获取当级文件夹)
1.如果file对象指向的是一个文件,那么方法的返回值是null,则会发生空指针异常
2.如果file对象指向的是一个空文件夹,那么方法会返回一个内容为0的空数组,且不会出现空指针异常
File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
其中FileFilter filter是一个接口,且是文件夹过滤器
FileFilter filter接口中有且仅有一个抽象方法: boolean accept(File file)
对该方法进行重写后就是对file对象进行某种判断
1.如果返回值是true,则通过
2.如果返回值是false,则不通过
具体代码实现
package com.tan.file;
import java.io.File;
import java.io.FileFilter;
/*
问题描述:
递归实现:
遍历一个文件夹下所有的.exe文件(不只是,单击文件夹中的,还包括多级文件夹中的.exe文件)
递归实现:
1.定义方法,并且有形参-->文件夹对象
2.出口--> 文件夹下没有文件夹了 --> 是文件就是出口
3.再次调用方法的时候要有实际参数的变化-->第一次调用:根目录文件夹 再次调用:子文件夹... 直到最后一次:文件
*/
public class FileDemo {
public static void main(String[] args) {
File file = new File("E:\\TAN\\JAVA\\software");
printFileName(file);
}
public static void printFileName(File root) {
// 出口:是文件就出方法,并且打印文件名
if (root.isFile()){
System.out.println(" 文件有: " + root.getName());
return;
}
System.out.println("文件夹有: " + root.getName());
// 能执行到这里来,说明root是文件夹,取出文件夹中的所有文件或者文件夹
File[] files = root.listFiles(new FileFilter() {
// 过滤掉不是.exe文件的文件
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".exe") || pathname.isDirectory();
}
});
// file:文件夹下的文件或者文件夹
for (File file : files) {
printFileName(file);
}
}
}