Java中的File类你知道多少?

File概述

在 Java 中,File 类是 java.io 包中惟一表明磁盘文件自己的对象,也就是说,若是但愿在程序中操做文件和目录,则均可以经过 File 类来完成。File 类定义了一些方法来操做文件,如新建、删除、重命名文件和目录等。java

File类的构造方法

File 类提供了以下三种形式构造方法。windows

  1. File(String path):若是 path 是实际存在的路径,则该 File 对象表示的是目录;若是 path 是文件名,则该 File 对象表示的是文件。
  2. File(String path, String name):path 是路径名,name 是文件名。
  3. File(File dir, String name):dir 是路径对象,name 是文件名。

使用任意一个构造方法均可以建立一个 File 对象

File类的经常使用方法

方法名称 说明
boolean canRead() 测试应用程序是否能从指定的文件中进行读取
boolean canWrite() 测试应用程序是否能写当前文件
boolean delete() 删除当前对象指定的文件
boolean exists() 测试当前 File 是否存在
String getAbsolutePath() 返回由该对象表示的文件的绝对路径名
String getName() 返回表示当前对象的文件名或路径名(若是是路径,则返回最后一级子路径名)
String getParent() 返回当前 File 对象所对应目录(最后一级子目录)的父目录名
boolean isAbsolute() 测试当前 File 对象表示的文件是否为一个绝对路径名。该方法消除了不一样平台的差别,能够直接判断 file 对象是否为绝对路径。在 UNIX/Linux/BSD 等系统上,若是路径名开头是一条斜线/,则代表该 File 对象对应一个绝对路径;在 Windows 等系统上,若是路径开头是盘符,则说明它是一个绝对路径。
boolean isDirectory() 测试当前 File 对象表示的文件是否为一个路径
boolean isFile() 测试当前 File 对象表示的文件是否为一个“普通”文件
long lastModified() 返回当前 File 对象表示的文件最后修改的时间
long length() 返回当前 File 对象表示的文件长度
String[] list() 返回当前 File 对象指定的路径文件列表
String[] list(FilenameFilter) 返回当前 File 对象指定的目录中知足指定过滤器的文件列表
boolean mkdir() 建立一个目录,它的路径名由当前 File 对象指定
boolean mkdirs() 建立一个目录,它的路径名由当前 File 对象指定
boolean renameTo(File) 将当前 File 对象指定的文件改名为给定参数 File 指定的路径名

File类中的俩个经常使用变量

  • public static final String pathSeparator:指的是分隔连续多个路径字符串的分隔符,Windows 下指;。例如 java -cp test.jar;abc.jar HelloWorld。
  • public static final String separator:用来分隔同一个路径字符串中的目录的,Windows 下指/。例如 C:/Program Files/Common Files。

注意:

能够看到 File 类的常量定义的命名规则不符合标准命名规则,常量名没有所有大写,这是由于 Java 的发展通过了一段至关长的时间,而命名规范也是逐步造成的,File 类出现较早,因此当时并无对命名规范有严格的要求,这些都属于 Java 的历史遗留问题。数组

Windows 的路径分隔符使用反斜线“\”,而 Java 程序中的反斜线表示转义字符,因此若是须要在 Windows 的路径下包括反斜线,则应该使用两条反斜线或直接使用斜线“/”也能够。Java 程序支持将斜线当成平台无关的路径分隔符。ide

假设在 Windows 操做系统中有一文件 D:\javaspace\hello.java,在 Java 中使用的时候,其路径的写法应该为 D:/javaspace/hello.java 或者 D:\javaspace\hello.java。工具

获取文件属性

在 Java 中获取文件属性信息的第一步是先建立一个 File 类对象并指向一个已存在的文件, 而后调用表 1 中的方法进行操做。
例1:
假设有一个文件位于 C:\windows\notepad.exe。编写 Java 程序获取并显示该文件的长度、是否可写、最后修改日期以及文件路径等属性信息。实现代码以下:开发工具

public class Test02 {
    public static void main(String[] args) {
        String path = "C:/windows/"; // 指定文件所在的目录
        File f = new File(path, "notepad.exe"); // 创建File变量,并设定由f变量引用
        System.out.println("C:\\windows\\notepad.exe文件信息以下:");
        System.out.println("============================================");
        System.out.println("文件长度:" + f.length() + "字节");
        System.out.println("文件或者目录:" + (f.isFile() ? "是文件" : "不是文件"));
        System.out.println("文件或者目录:" + (f.isDirectory() ? "是目录" : "不是目录"));
        System.out.println("是否可读:" + (f.canRead() ? "可读取" : "不可读取"));
        System.out.println("是否可写:" + (f.canWrite() ? "可写入" : "不可写入"));
        System.out.println("是否隐藏:" + (f.isHidden() ? "是隐藏文件" : "不是隐藏文件"));
        System.out.println("最后修改日期:" + new Date(f.lastModified()));
        System.out.println("文件名称:" + f.getName());
        System.out.println("文件路径:" + f.getPath());
        System.out.println("绝对路径:" + f.getAbsolutePath());
    }
}

在上述代码中 File 类构造方法的第一个参数指定文件所在位置,这里使用C:/做为文件的实际路径;第二个参数指定文件名称。建立的 File 类对象为 f,而后经过 f 调用方法获取相应的属性,最终运行效果以下所示。测试

C:\windows\notepad.exe文件信息以下:
============================================
文件长度:193536字节
文件或者目录:是文件
文件或者目录:不是目录
是否可读:可读取
是否可写:可写入
是否隐藏:不是隐藏文件
最后修改日期:Mon Dec 28 02:55:19 CST 2016
文件名称:notepad.exe
文件路径:C:\windows\notepad.exe
绝对路径:C:\windows\notepad.exe

> 建立和删除文件

File 类不只能够获取已知文件的属性信息,还能够在指定路径建立文件,以及删除一个文件。建立文件须要调用 createNewFile() 方法,删除文件须要调用 delete() 方法。不管是建立仍是删除文件一般都先调用 exists() 方法判断文件是否存在。
例 2:
假设要在 C 盘上建立一个 test.txt 文件,程序启动时会检测该文件是否存在,若是不存在则建立;若是存在则删除它再建立。spa

实现代码以下:操作系统

public class Test03 {
    public static void main(String[] args) throws IOException {
        File f = new File("C:\\test.txt"); // 建立指向文件的File对象
        if (f.exists()) // 判断文件是否存在
        {
            f.delete(); // 存在则先删除
        }
        f.createNewFile(); // 再建立
    }
}

运行程序以后能够发现,在 C 盘中已经建立好了 test.txt 文件。可是若是在不一样的操做系统中,路径的分隔符是不同的,例如:code

  • Windows 中使用反斜杠\表示目录的分隔符。
  • Linux 中使用正斜杠/表示目录的分隔符。

那么既然 Java 程序自己具备可移植性的特色,则在编写路径时最好能够根据程序所在的操做系统自动使用符合本地操做系统要求的分隔符,这样才能达到可移植性的目的。要实现这样的功能,则就须要使用 File 类中提供的两个常量。

代码修改以下:

public static void main(String[] args) throws IOException {
    String path = "C:" + File.separator + "test.txt"; // 拼凑出能够适应操做系统的路径
    File f = new File(path);
    if (f.exists()) // 判断文件是否存在
    {
        f.delete(); // 存在则先删除
    }
    f.createNewFile(); // 再建立
}

程序的运行结果和前面程序同样,可是此时的程序能够在任意的操做系统中使用。

注意:在操做文件时必定要使用 File.separator 表示分隔符。在程序的开发中,每每会使用 Windows 开发环境,由于在 Windows 操做系统中支持的开发工具较多,使用方便,而在程序发布时每每是直接在 Linux 或其它操做系统上部署,因此这时若是不使用 File.separator,则程序运行就有可能存在问题。关于这一点咱们在之后的开发中必定要有所警戒。

建立和删除目录

File 类除了对文件的建立和删除外,还能够建立和删除目录。建立目录须要调用 mkdir() 方法,删除目录须要调用 delete() 方法。不管是建立仍是删除目录均可以调用 exists() 方法判断目录是否存在。
例 3
编写一个程序判断 C 盘根目录下是否存在 config 目录,若是存在则先删除再建立。实现代码以下:

public class Test04 {
    public static void main(String[] args) {
        String path = "C:/config/"; // 指定目录位置
        File f = new File(path); // 建立File对象
        if (f.exists()) {
            f.delete();
        }
        f.mkdir(); // 建立目录
    }
}public class Test04 {
    public static void main(String[] args) {
        String path = "C:/config/"; // 指定目录位置
        File f = new File(path); // 建立File对象
        if (f.exists()) {
            f.delete();
        }
        f.mkdir(); // 建立目录
    }
}

遍历目录

经过遍历目录能够在指定的目录中查找文件,或者显示全部的文件列表。File 类的 list() 方法提供了遍历目录功能,该方法有以下两种重载形式。
1.String[] list()
该方法表示返回由 File 对象表示目录中全部文件和子目录名称组成的字符串数组,若是调用的 File 对象不是目录,则返回 null。

提示:list() 方法返回的数组中仅包含文件名称,而不包含路径。但不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。
2.String[] list(FilenameFilter filter)
该方法的做用与 list() 方法相同,不一样的是返回数组中仅包含符合 filter 过滤器的文件和目录,若是 filter 为 null,则接受全部名称。
例 4:
假设要遍历 C 盘根目录下的全部文件和目录,并显示文件或目录名称、类型及大小。使用 list() 方法的实现代码以下:

public class Test05 {
    public static void main(String[] args) {
        File f = new File("C:/"); // 创建File变量,并设定由f变量变数引用
        System.out.println("文件名称\t\t文件类型\t\t文件大小");
        System.out.println("===================================================");
        String fileList[] = f.list(); // 调用不带参数的list()方法
        for (int i = 0; i < fileList.length; i++) { // 遍历返回的字符数组
            System.out.print(fileList[i] + "\t\t");
            System.out.print((new File("C:/", fileList[i])).isFile() ? "文件" + "\t\t" : "文件夹" + "\t\t");
            System.out.println((new File("C:/", fileList[i])).length() + "字节");
        }
    }
}

因为 list() 方法返回的字符数组中仅包含文件名称,所以为了获取文件类型和大小,必须先转换为 File 对象再调用其方法。以下所示的是实例的运行效果:

文件名称  文件类型  文件大小
===================================================
$Recycle.Bin  文件夹  4096字节
Documents and Settings  文件夹  0字节
Download  文件夹  0字节
DRIVERS  文件夹  0字节
FibocomLog  文件夹  0字节
Gateface  文件夹  0字节
GFPageCache  文件夹  0字节
hiberfil.sys  文件  3375026176字节
Intel  文件夹  0字节
KuGou  文件夹  0字节
logs  文件夹  0字节
msdia80.dll  文件  904704字节
MSOCache  文件夹  0字节
MyDownloads  文件夹  0字节
MyDrivers  文件夹  0字节
news.template  文件  417字节
NVIDIA  文件夹  0字节
OneDriveTemp  文件夹  0字节
opt  文件夹  0字节
pagefile.sys  文件  6442450944字节
PerfLogs  文件夹  0字节
Program Files  文件夹  12288字节
Program Files (x86)  文件夹  8192字节
ProgramData  文件夹  12288字节
QMDownload  文件夹  0字节
Recovery  文件夹  0字节
swapfile.sys  文件  268435456字节
System Volume Information  文件夹  12288字节
Users  文件夹  4096字节
Windows  文件夹  16384字节

例 5:
假设但愿只列出目录下的某些文件,这就须要调用带过滤器参数的 list() 方法。首先须要建立文件过滤器,该过滤器必须实现 java.io.FilenameFilter 接口,并在 accept() 方法中指定容许的文件类型。

以下所示为容许 SYS、TXT 和 BAK 格式文件的过滤器实现代码:

public class ImageFilter implements FilenameFilter {
    // 实现 FilenameFilter 接口
    @Override
    public boolean accept(File dir, String name) {
        // 指定容许的文件类型
        return name.endsWith(".sys") || name.endsWith(".txt") || name.endsWith(".bak");
    }
}public class ImageFilter implements FilenameFilter {
    // 实现 FilenameFilter 接口
    @Override
    public boolean accept(File dir, String name) {
        // 指定容许的文件类型
        return name.endsWith(".sys") || name.endsWith(".txt") || name.endsWith(".bak");
    }
}

上述代码建立的过滤器名称为 ImageFilter,接下来只须要将该名称传递给 list() 方法便可实现筛选文件。以下所示为修改后的 list() 方法,其余代码与例 4 相同,这里再也不重复。

String fileList[] = f.list(new ImageFilter());

再次运行程序,遍历结果以下所示:再次运行程序,遍历结果以下所示:

文件名称        文件类型        文件大小
===================================================
offline_FtnInfo.txt        文件        296字节
pagefile.sys        文件        8436592640字节
相关文章
相关标签/搜索