File
File 类
Java 中操作一个文件或者目录,可以使用 File 类对象,它可以代表磁盘上的一个文件,或者目录(文件夹)的信息
文件或者目录可以不存在
File 功能:
1. 创建文件、目录
2. 删除文件、目录
3. 获取文件/目录的一些属性信息:大小、最后修改日期、文件名等
相对路径和绝对路径
相对路径:相对路径就是相对于当前文件的路径。
绝对路径:绝对路径就是硬盘上真正的路径。
File 类的构造函数
注意:
一个 File 对象表示的”文件/目录”可能在磁盘上不存在,这不影响 File 对象的构造,后期可以通过 File 类中的一些方法来判断此文件/目录是否存在
通过 File 类,只能获取文件/目录的一些属性信息,不能对文件的内容进行读、写操作;
通过构造方法创建 File 对象
示例代码
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 绝对路径
File f1 = new File("C:\\GF_Train_Doc\\Test\\abc.txt");
// 相对路径(项目根目录)
File f2 = new File("demo17.txt");
// 作用和f1相同
File f3 = new File("C:\\GF_Train_Doc", "Test\\abc.txt");
File f4 = new File("C:\\GF_Train_Doc");
// 跟 file3 和 file1 的效果相同
File file5 = new File(f4, "abc.txt");
}
}
File 类的创建、删除功能
File 类可以创建、删除文件
static File createTempFile(String prefix,String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
boolean mkdir() 创建抽象路径名指定的目录
boolean mkdirs() 创建抽象路径名指定的目录,包括所有必须但不存在的父目录
boolean delete() 删除此抽象路径名表示的文件或目录
#####示例代码
public class Test02 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File f1 = new File("c.txt");// 相对路径,默认存储在项目根目录下
File f2 = new File("b");
File f3 = new File("d\\one\\two\\three");
System.out.println(f1.createNewFile());
//在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
System.out.println(File.createTempFile("t1toolong", ".md"));
//创建抽象路径名指定的目录
System.out.println(f2.mkdir());
//创建抽象路径名指定的目录,包括所有必须但不存在的父目录
System.out.println(f3.mkdirs());
//删除此抽象路径名表示的文件或目录
System.out.println(f3.delete());//只能删除指定目录的最外层目录
}
}
File类重命名功能
boolean renameTo(File dest) 重新命名此抽象路径名表示的文件
注意
如果 dest 和原文件不在同目录下,重命名操作将会相当于”剪切”操作
如果 dest 和原文件在同目录下,相当于”重命名”
示例代码
public class Test03 {
public static void main(String[] args) {
File file = new File("a.txt");
// 重命名都项目根目录下:
// File dest = new File("a_2.txt");// 同目录下
// System.out.println("重命名文件:" + file.renameTo(dest));
File dest2 = new File("D:\\a_2.txt");// 不同目录下相当于剪切功能
System.out.println("重命名文件:" + file.renameTo(dest2));
}
}
File类判断功能
boolean isDirectory() 测试此抽象路径名表示的文件是否在是一个目录
boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件
boolean exists() 测试此抽象路径名表示的文件或目录是否存在
boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件
boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件
boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件
示例代码
public class Test04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f1 = new File("b");// 已存在的目录
File f2 = new File("c.txt");// 已存在的txt文件
// 测试此抽象路径名表示的文件是否在是一个目录
System.out.println(f1.isDirectory());
// 测试此抽象路径名表示的文件是否是一个标准文件
System.out.println(f2.isFile());
// 测试此抽象路径名表示的文件或目录是否存在
System.out.println(new File("aer").exists());
// 测试应用程序是否可以读取此抽象路径名表示的文件
System.out.println(f1.canRead());
// 测试应用程序是否可以修改此抽象路径名表示的文件
System.out.println(f2.canWrite());
// 测试此抽象路径名指定的文件是否是一个隐藏文件
System.out.println(f1.isHidden());
// System.out.println(f1.isAbsolute());
}
}
File类的获取功能
获取文本基本信息
File 可以获取文件的基本信息
String getName() 返回由此抽象路径名表示的文件或目录的名称
String getPath() 将此抽象路径名转换为一个路径名字符串
String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
long length() 返回由此抽象路径名表示的文件的长度
long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间
代码示例
public class Test05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f1 = new File("b");// 已存在的目录
File f2 = new File("c.txt");// 已存在的txt文件
//返回由此抽象路径名表示的文件或目录的名称
System.out.println(f1.getName());
//将此抽象路径名转换为一个路径名字符串
System.out.println(f2.getPath());
//返回此抽象路径名的绝对路径名字符串
System.out.println(f1.getAbsolutePath());
//返回由此抽象路径名表示的文件的长度
System.out.println(f2.length());
//返回此抽象路径名表示的文件最后一次被修改的时间
System.out.println(f2.lastModified());
long n = f2.lastModified();
Date date = new Date(n);
System.out.println(date);
}
}
File批量获取功能
文件都存放在目录(文件夹)中,那么如何获取一个目录中的所有文件或者目录中的文件夹呢?
String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
File[] listFile() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
示例代码
public class Test06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f1 = new File("d");// 已存在的多层目录
File f2 = new File("c.txt");// 已存在的txt文件
//list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
// for (String str : f1.list()) {
// System.out.println(str);
// }
//listFile() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
for (File f : f1.listFiles()) {
System.out.println(f.getName());
}
}
}
注意:在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须是存在的,
2,指定的必须是目录。否则容易引发返回数组为 null,出现 NullPointerException
文件过滤器
通过 list iles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?
我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中对后缀名或文件名进行排队,达到筛选的效果,但是这样做比较繁琐,所以 ava提供了比较边界的工具类,那就是过滤器
FilenameFilter 文件名称过滤器
File 类中重载的 listFiles 方法,并且接受指定的过滤器。
File[] listFiles(FilenameFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
- FilenameFilter 是一个接口,该接口只有一个方法,使用时自定类继承 FilenameFilter 过滤器接口,或者使用匿名内部类
boolean accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中
示例代码
//过滤器
public class MyFileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(".txt");
}
}
//测试类
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("C:\\Users\\*********\\workspace\\4.9");
// 获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
File[] files = file.listFiles(new MyFileFilter());
// 遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
文件过滤器
File 的重载方法 listFiles(FileFilter filter) 也可以接受一个 FileFilter 过滤器,
- listFiles(FileFilter filter)方法
File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
- FileFilter接口
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中
FileFilter 和 FilenameFilter 有什么别呢?
FilenameFilte过滤器中的accept方法接受两个参数, 一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。
FileFilter 过滤器中的 accept 方法接受一个参数,这个参数就当前文件或文件夹对象当我们需要过滤文件名称时就可以使用 FilenameFilter 这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用 FileFilter 过滤器。
示例代码
//过滤器
class FileFileterByDir implements FileFilter {
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
//测试类
public class Test08 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("d");
File[] files = file.listFiles(new FileFileterByDir());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}