第十二章《文件与I/O流》第1节:Java的文件管理

时间:2023-01-02 22:11:32

​Java语言中,一个类就代表了一种事物,计算机磁盘上的文件和文件夹也是一种事物,文件夹也叫目录,Java语言以File类来代表计算机的磁盘文件以及目录,类的主要功能有:

  • 获取和设置磁盘文件或文件夹的基本属性。​
  • 创建和删除文件或目录。​
  • 扫描文件夹​

本小节将讲解如何使用File类来操作文件以及目录。​


12.1.1 使用File类操作文件

File类位于java.io包下,在Java语言中,一个File类的对象就表示磁盘上的一个文件或目录,File类的构造方法很多,但最常用的构造方法只有三个,如表12-1所示。​

表12-1File类常用构造方法​

File(String path)

File(String path, String filename)

File(File path, String filename)

表中第一个构造方法仅有一个字符串类型的参数path,path参数表示文件所在目录以及文件的名称。第二个构造方法有两个字符串参数,第一个参数path表示文件所在目录,第二个参数filename表示文件的名称。第三个构造方法也有两个参数,其中第一个参数以path属于File型,它也表示文件所在目录,而第二个参数也表示文件的名称。需要注意:以字符串表示的文件名称必须包含文件的后缀名。文件所在目录可以用相对路径和绝对路径两种方式来表示。如果以相对路径来表示目录,那么目录表示位于IDEA的工程文件夹下的文件夹。例如:​

File file = new File("abc","game.txt");

以上代码中,参数“abc”表示文件所在目录,这个目录就是使用相对路径的形式表示。如果开发者使用IDEA编程工具,那么这个目录表示工程文件夹中的abc文件夹。磁盘上的目录往往分为多层,在Java语言中,每一层目录以“/”或“\\”作为路径分隔符。此外,在表示相对路径时,使用“.”表示当前目录, “..”表示上一级目录,“/”或“\\”表示磁盘根目录。​

File类提供了很多用于操作文件和获取文件属性的方法,如表12-2所示。​

表12-2 File类常用方法​

方法

作用

String getName()

返回此File对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)

String getPath()

返回此File对象所对应的路径名

File getAbsoluteFile()

返回此File对象的绝对路径

String getAbsolutePath()

返回此File对象所对应的绝对路径名

String getParent()

返回此File对象所对应目录(最后一级子目录)的父目录名

boolean renameTo(File newName)

重命名此File对象所对应的文件或目录,如果重命名成功,则返回true,否则返回false

boolean exists()

判断File对象所对应的文件或目录是否存在

boolean canWrite()

判断File对象所对应的文件和目录是否可写

boolean canRead()

判断File对象所对应的文件和目录是否可读

boolean isFile()

判断File对象所对应的是否是文件,而不是目录

boolean isDirectory()

判断File对象所对应的是否是目录,而不是文件

boolean isAbsolute()

判断File对象所对应的文件或目录是否是绝对路径

long lastModified()

返回文件的最后修改时间

long length()

返回文件内容的大小(单位:字节)

boolean createNewFile()

当此 File对象所对应的文件不存在时,新建一个该File对象所指定的新文件,如果创建成功则返回 true;否则返回false。

boolean delete()

删除 File对象所对应的文件或目录,删除成功返回true,否则返回false

void deleteOnExit()

如果File类对象对应的文件或路径存在时进行删除

下面的【例12_01】展示了如何使用File类的方法访问一个文件。由于程序要对文件进行操作,读者需要在C盘根目录下新建一个名为temp的文件夹,之后在文件夹中新建一个12_01.txt文本文件,在这个文件中写入“你好abc”并保存。​

【例12_01 使用File类访问文件】

Exam12_01.java​

import java.io.File;
public class Exam12_01 {
public static void main(String[] args) {
File file = new File("C:/temp/12_01.txt");
System.out.println("文件是否存在:"+file.exists());
System.out.println("文件路径:"+file.getPath());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件所在目录:"+file.getParent());
System.out.println("是否可读:"+file.canRead());
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否是隐藏文件:"+file.isHidden());
System.out.println("是否是普通文件:"+file.isFile());
System.out.println("是否是文件目录:"+file.isDirectory());
System.out.println("文件的最后修改时间:"+file.lastModified());
System.out.println("文件大小:"+file.length()+"字节");
}
}

【例12_01】的运行结果如图12-1所示。​

第十二章《文件与I/O流》第1节:Java的文件管理

图12-1【例12_01】运行结果​

从图12-1可以看出:文件的最后修改是时间是一个long型的数据,这个数字实际上就是距离时间原点的毫秒数,读者可以用这个数字作为参数创建一个Date类对象,这样就能获得文件最后被修改的年月日和时分秒。此外还可以看出:文件的大小为7字节,这是因为在txt文件默认编码格式下,每个汉字占据2个字节,而每个英文字母占据1个字节,因此文件中的“你好abc”总共占7字节。如果File类对象表示的是一个根本不存在的文件,那么程序运行时所有返回值类型为boolean的方法将全部返回false,而最后修改时间以及文件的大小都是0,读者可以自行尝试使用File类对象表示一个不存在的文件并获取其各项属性。​

12.1.2使用File类操作目录

File类不仅仅定义了操作文件的方法,还定义了用于操作目录的方法,如表12-3所示。​

表12-3File类操作目录的方法​

方法

作用

String[] list()

列出目录中的所有文件或子目录的名称

String[] list(FilenameFilter filter)

列出目录特定名称或后缀名的文件和子目录

File[] listFiles()

列出目录中所有文件和子目录

File[] listFiles(FilenameFilter filter)

列出目录中特定名称或后缀名的文件

boolean mkdir()

建立单级目录

boolean mkdirs()

建立多级目录

static File[] listRoots

列出系统所有根目录(即磁盘分区)

从表12-3可以看出:list()方法和listFiles()方法都可以没有参数,也都可以添加一个FilenameFilter类型的参数。FilenameFilter是一个接口,该接口定义了一个抽象方法accept(),这个方法用来定义哪些名称的文件会被列出,因此程序员在实现accept()抽象方法时要设定文件的筛选条件。下面的【例12_02】展示了如何用File类对象操作目录,为展示出搜索文件的效果,各位读者需要在C盘的temp的文件夹中再新建一些文件,如图12-2所示。​

第十二章《文件与I/O流》第1节:Java的文件管理

图12-2 temp文件夹​

【例12_02使用File类访问目录】

Exam12_02.java​

import java.io.*;
class Filter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
// 搜索所有txt文本文件
return name.endsWith(".txt");
}
}
public class Exam12_02 {
public static void main(String[] args) {
Filter filter = new Filter();
File dir = new File("C:/temp");//dir是要访问的目录
//列出该目录下所有文件的名称
String[] names1 = dir.list();
System.out.println("temp文件夹下所有文件及子文件夹的名称:");
for(String name:names1){
System.out.print(name+" ");
}
System.out.println();
//列出该目录下txt文本文件名称
String[] names2 = dir.list(filter);
System.out.println("temp文件夹下所有txt文件的名称:");
for(String name:names2){
System.out.print(name+" ");
}
System.out.println();
//列出该目录下所有文件
File[] files1 = dir.listFiles();
System.out.println("temp文件夹下所有文件及子文件夹详情:");
System.out.printf("%-25s%-15s%-10s\n","名称","大小","是否为目录");
for(File file:files1){
String name= file.getName();
long length = file.length();
boolean isDir = file.isDirectory();
System.out.printf("%-20s%-15d%-10b\n",name,length,isDir);
}
}
}

【例12_02】的Exam12_02.java文件中包含两个类,其中Filter类是FilenameFilter接口的实现类,它在实现accept()抽象方法时指定要列出的文件必须以“.txt”作为名称结尾。【例12_02】的运行结果如图12-3所示。​

第十二章《文件与I/O流》第1节:Java的文件管理

图12-3【例12_02】运行结果​

从图12-3可以看出:在列出以“.txt”作为名称结尾的文件时,把文件夹“文件夹1.txt”也列了出来,如果想只是列出文件不包括文件夹,还需要用isFile()方法进行第二次筛选。

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。