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所示。
图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所示。
图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所示。
图12-3【例12_02】运行结果
从图12-3可以看出:在列出以“.txt”作为名称结尾的文件时,把文件夹“文件夹1.txt”也列了出来,如果想只是列出文件不包括文件夹,还需要用isFile()方法进行第二次筛选。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。
标签:文件,12,Java,第十二章,System,File,目录,out From: https://blog.51cto.com/mugexuetang/5983689