黛蛾长敛,任是春风吹不展。困倚危楼,过尽飞鸿字字愁。

——秦观《木兰花》

Java的File类

java.io.File 类是文件目录路径名的抽象表示,主要用于文件和目录的创建查找删除等操作。

  • 一个file对象代表的是硬盘中实际存在的一个文件或者一个文件夹。

  • 无论该路径是否在在文件或者文件夹,都不会影响file对象的创建。

  • 路径分隔可以使用”/“ 也可以使用”\“但是在java语言中,”\“具有特殊的含义,所以需要使用转义字符”\“,使用”/“的时候不需要转义

    • windows操作系统可以识别”/“,也可以识别”\“

    • linux操作系统只认识”/“

      • mac操作系统只认识”/“
      • 所以开发的时候一定使用”/“

1. File类的构造方法

  • public File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
//file是文件和文件夹(文件路径的抽象表示),主要用于文件和目录的创建,查找,和删除的操作。
//直接使用file路径创建一个文件对象
File file = new File("E:/Dr");

//使用两个参数的构造方法创建对象的时候,如果多个路径的间隔符没写会自动添加,多了会自动删除
File file11 = new File("E:/Dr","哎呦-喵喵喵喵喵.txt");//第一种
File file12 = new File("E:/Dr/","哎呦-喵喵喵喵喵.txt");//第二种
File file13 = new File("E:/Dr/","/哎呦-喵喵喵喵喵.txt");//第三种


File file2 = new File("E:\\Dr\\D 照片");//第二种

File file3 = new File(file,"mm.txt");//第三种
}

2. 常用方法

  • public String getAbsolutePath() :获得file对象的绝对路径
  • public String getPath():获得file文件的路径
  • public String getName() :获取文件或文件夹的名称
  • public long length():获得文件的大小(字节为单位)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(String[] args) {
File file = new File("E:/Dr/D 照片","/mm.txt");
File file2 = new File("dd/ai/mm");
File file3 = new File("E:/Dr/D 照片/范丹/IMG_20180217_165312.jpg");


String absolutePath = file.getAbsolutePath();
//.getAbsolutePath();获得的是当前文件的绝对路径
System.out.println( "absolutePath = " + absolutePath );

//.getPath();获得file文件的路径
String path = file.getPath();
System.out.println( "path = " + path );

//.getName();获得file的文件名或者文件夹名。
String name = file2.getName();
System.out.println( "name = " + name );//mm

//.length();获得文件的大小(字节为大小)
long length = file3.length();
System.out.println( "length = " + length );
}
  • public boolean exists():此File表示的文件或目录是否实际存在。

  • public boolean isDirectory() :此File表示的是否为目录。

  • public boolean isFile():此File表示的是否为文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
File file = new File("E:/Dr/D 照片/mm.txt");

//.exists();判断文件或者文件夹是否存在
boolean exists = file.exists();
System.out.println( "exists = " + exists );//true 存在

File file1 = new File("D:/workspace/out");
boolean exists1 = file1.exists();
System.out.println( "exists1 = " + exists1 );//true

//.isDirectory();判断当前的file是不是文件夹
boolean directory = file1.isDirectory();
System.out.println( "directory = " + directory );//true

//.isFile();判断当前的file是不是文件
boolean file2 = file1.isFile();
System.out.println( "file2 = " + file2 );//false
}
  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

  • public boolean delete() :删除由此File表示的文件或目录(空目录)。

  • public boolean mkdir() :创建由此File表示的目录。

  • public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。

2.1 目录的遍历

  • public String[] list():返回一个String数组,表示该File目录中的所有子文件或目录。

  • public File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void test() throws IOException {
File file = new File("E:/file");

String[] list = file.list();
//s = 凤凰传奇 - 自由飞翔.mp3
for (String s : list) {
System.out.println("s = " + s);
}

File[] files = file.listFiles();
//file1 = E:\file\凤凰传奇 - 自由飞翔.mp3
for (File file1 : files) {
System.out.println("file1 = " + file1);
}
}//这样遍历目录只能打印一级目录名称,如果需要打印多级目录名称需要使用递归的思想!

3. 案例

  1. 搜索 E:/Dr目录中的.doc 文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void test(){
File file = new File("E:/Dr");
String suffix = ".doc";
search(file,suffix);
}

public void search(File file, String suffix){
File[] files = file.listFiles();
//遍历一级目录
for (File file1 : files) {
//如果是一个目录,再次执行此方法
if(file1.isDirectory()){
search(file1,suffix);
}else{
//是文件且以.doc 结尾的文件,打印其名称名
String name = file1.getName();
if(name.endsWith(suffix)){
System.out.println(file1.getName());
}
}
}
}

文件过滤器FileFilter

  • java.io.FileFilter 是一个接口,是File的过滤器。 该接口的对象可以传递给File类的 listFiles(FileFilter)作为参数, 接口中只有一个方法。

  • boolean accept(File pathname):测试pathname是否应该包含在当前File目录中,符合则返回true。

分析

  1. 接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。

  2. accept 方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:

    1. 要么是.java文件。

    2. 要么是目录,用于继续遍历。

  3. 通过过滤器的作用, listFiles(FileFilter) 返回的数组元素中,子文件对象都是符合条件的,可以直接打印。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    /**
* 文件过滤器FileFilter 主要用来过滤文件。想一个筛子一样。只保留我们需要的数据
* 见HomeWorkFour
*/

@Test
public void test(){
File file = new File("E:/Dr");
File[] files = file.listFiles(new MyFilter());
for (File file1 : files) {
if(file1.isFile()) System.out.println( "file1 = " + file1 );
}
}


class MyFilter implements FileFilter {
@Override
public boolean accept(File file) {
if(file.getName().endsWith( ".jpg" )){
return true;
}
return false;
}
}

分析: FileFilter 是只有一个方法的接口,因此可以用lambda表达式简写。lambda格式: ()‐>{ }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**练习四:文件过滤器的使用
描述:
获得指定文件夹下所有的java文件(不考虑子文件夹的)并输出到控制台
*/
public class HomeWorkFour {

@Test
public void Test(){
File file = new File("E:\\Dr\\D 照片\\荣耀八\\portrait");
File[] files = file.listFiles((pathname) -> pathname.getName().endsWith( ".jpg" ));
for (File file1 : files) {
if(file1.isFile()){
System.out.println(file1.getName());
}
}
}

@Test
public void Test01(){
File file = new File("D:\\workspace\\day07\\src\\cn\\justweb\\Demo");
File[] files = file.listFiles(new FileFilter(){
@Override
public boolean accept(File file) {
if(file.getName().endsWith( ".java" )){
return true;
}
return false;
}
});
for (File file1 : files) {
if(file1.isFile()){
System.out.println(file1.getName());
}
}
}
}