java---文件处理

1,076 阅读11分钟

File

1、 简介

官话:文件和目录路径名的抽象表示。

  • File 类主要用来获取或处理与磁盘文件相关的信息,像文件名、文件路径、访问权限和修改日期等。
  • File 类表示处理文件和文件系统的相关信息。也就是说,其不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性。
  • File 类的实例是不可变的; 也就是说,一旦创建, File对象表示的抽象路径 File 永远不会改变。

 1.1、 路径表示

用户界面和操作系统使用依赖于系统的 路径名字符串 来命名文件和目录。此类提供了一个抽象的,与系统无关的分层路径名视图。

  • 组成部分

  抽象路径名中的第一个名称可以是目录名称,对于Microsoft Windows UNC路径名,可以是主机名。抽象路径名中的每个后续名称表示目录,最后一个可以表示目录或文件。

组成部分
可选系统有关的 前缀 字符串,如磁盘驱动器符, "/"对于UNIX根目录下,或者"\\"的Microsoft Windows UNC路径。
一个零个或多个字符串 名称 的序列。
  • 绝对路径

  从 盘符 开始命名的完整路径,不需要其他信息来定位它表示的文件。

String dir = "D:\\1.txt";
File file = new File(dir);
file.getAbsoluteFile();    // D:\1.txt
  • 相对路径

  相对路径名必须根据从其他路径名获取的信息来解释,一般相对于当前工程目录。

String dir = "1.txt";
File file = new File(dir);
file.getAbsoluteFile();    // E:\file\java learn\deal_bigint\1.txt
  • 默认情况下, java.io 程序包中的类始终解析当前用户目录的相对路径名。此目录由系统属性 user.dir 命名,通常是调用Java虚拟机的目录。

  • 将路径名字符串转换为抽象路径名或从抽象路径名转换本质上取决于系统。将抽象路径名转换为路径名字符串时,每个名称将通过默认 分隔符 的单个名称与下一个名称分隔开。 默认的名称分隔符由系统属性 file.separator 定义,并在此类的公共静态字段 separatorseparatorChar 中可用。

  • 抽象路径名的父级可以通过调用此类的 getParent() 方法获得,并且包含路径名的前缀以及路径名的名称序列中的每个名称(除了最后一个)。 每个目录的绝对路径名是任何 File 对象的祖先,其绝对抽象路径名以目录的绝对路径名开头。 例如,抽象路径名 "/usr" 表示的目录是路径名 "/usr/local/bin" 表示的目录的祖先。

 1.2、 前缀概念

  前缀概念用于处理 UNIX平台上的根目录,以及 Microsoft Windows平台上的驱动器 说明符,根目录和UNC路径名,如下所示:

前缀表达
对于UNIX平台,绝对路径名的前缀始终为 "/" 。 相对路径名没有前缀。 表示根目录的抽象路径名具有前缀"/"和空名称序列。
对于Microsoft Windows平台,包含驱动器说明符的路径名的前缀由驱动器号后跟 ":" 组成,如果路径名是绝对路径,则可能后跟 "\\" 。 UNC路径名的前缀是 "\\\\" ; 主机名和共享名称是名称序列中的前两个名称。 未指定驱动器的相对路径名没有前缀。

 1.3、 其他

  此类的实例可能表示也可能不表示实际的文件系统对象,例如 文件目录

  • 如果它确实表示这样的对象,则该对象驻留在 分区中 。 分区是文件系统的特定于操作系统的存储部分。

  • 文件系统可以对实际文件系统对象上的某些操作实施限制,例如 读取 写入 执行 。 这些限制统称为 访问权限 。 文件系统可能在单个对象上具有多组访问权限。对象的访问权限可能导致此类中的某些方法失败。

2、 字段解释

 2.1 字段描述

变量和类型字段描述
static StringpathSeparator与系统相关的路径分隔符,表示为字符串。
static charpathSeparatorChar与系统相关的路径分隔符。
static Stringseparator系统相关的默认名称分隔符,表示为字符串。
static charseparatorChar系统相关的默认名称分隔符。

 2.2 window 下的字段表示

  四个字段都是由 public static final 修饰的全局常量。

  • pathSeparator

    pathSeparatorChar 的字符串表示

System.out.println(File.pathSeparator);    // ";"
  • pathSeparatorChar

    在UNIX系统上,此字符为':' ; 在Microsoft Windows系统上,它是';'

System.out.println(File.pathSeparatorChar);    // ";"
  • separator

    separatorChar 的字符串表示

System.out.println(File.separator);    // "\"
  • separatorChar

    UNIX 系统上,此字段的值为'/' ; 在 Microsoft Windows 系统上,它是'\\'

System.out.println(File.separatorChar);    // "\"

3、 方法解释

 3.1 方法描述

  • 构造方法
方法描述
File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File 实例。
File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例。
File(URI uri)通过将给定的 URI 转换为抽象路径名来创建新的 File实例。
  • 常用方法
变量类型方法描述
booleanexists()测试此抽象路径名表示的文件或目录是否存在。
StringgetAbsolutePath()返回此抽象路径名的绝对路径名字符串。
FilegetAbsoluteFile()返回此抽象路径名的绝对形式。
StringgetName()返回此抽象路径名表示的文件或目录的名称。
StringgetParent()返回此抽象路径名父项的路径名字符串,如果此路径名未指定父目录,则返回 null
StringgetPath()将此抽象路径名转换为路径名字符串。
booleanisAbsolute()测试此抽象路径名是否为绝对路径。
booleanisDirectory()测试此抽象路径名表示的文件是否为目录。
booleanisFile()测试此抽象路径名表示的文件是否为普通文件
longlength()返回此抽象路径名表示的文件的长度。
String[]list()返回一个字符串数组,此抽象路径名为父目录表示的的文件和目录。
String[]list(FilenameFilter filter)list()作用一致,多了一个过滤器。
File[]listFiles()返回一个抽象路径名数组,表示此抽象路径名为父目录表示的目录中的文件。
File[]listFiles(FileFilter filter)listFiles()作用一致,多了一个过滤器。
booleanmkdir()创建此抽象路径名指定的目录,不创建父目录。
booleanmkdirs()创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。
booleanrenameTo(File dest)重命名此抽象路径名表示的文件。
StringtoString()返回此抽象路径名的路径名字符串。
  • 其他方法

 3.2 方法解释

 3.2.1 File(String pathname)

  通过将给定的路径名字符串转换为抽象路径名来创建新的 File 实例。 如果给定的字符串是空字符串,则结果是空的抽象路径名。

  • 内部源码
public File(String pathname) {
        if (pathname == null) {
            throw new NullPointerException();
        } else {
            this.path = fs.normalize(pathname);
            this.prefixLength = fs.prefixLength(this.path);
        }
    }
  • 代码测试
File file = new File("1.txt");
System.out.println(file.getAbsoluteFile());    // E:\...1.txt
File file = new File("");
System.out.println(file.getAbsoluteFile());    // E:\...
System.out.println(file.isDirectory());        // false
  • 虽然传入空的字符串虽然也能生成 file 对象,但是实际不存在

 3.2.2 File(String parent, String child)

  从父路径名字符串和子路径名字符串创建新的File实例。

  • 如果 parentnull 则创建新的 File 实例,就好像通过在给定的 child 路径名字符串上调用单参数 File 构造函数 child

  • 否则, parent 路径名字符串用于表示目录, child 路径名字符串用于表示目录或文件。如果child 路径名字符串是绝对的,那么它将以系统相关的方式转换为相对路径名。 如果 parent 是空字符串,则通过将 child 转换为抽象路径名并根据系统相关的默认目录解析结果来创建新的File 实例。 否则,将每个路径名字符串转换为抽象路径名,并针对父路径解析子抽象路径名。

  • 内部源码

public File(String parent, String child) {
        if (child == null) {
            throw new NullPointerException();
        } else {
            if (parent != null) {
                if (parent.equals("")) {
                    this.path = fs.resolve(fs.getDefaultParent(), fs.normalize(child));
                } else {
                    this.path = fs.resolve(fs.normalize(parent), fs.normalize(child));
                }
            } else {
                this.path = fs.normalize(child);
            }
            this.prefixLength = fs.prefixLength(this.path);
        }
    }
  • 代码测试
File file = new File("d:\\test", "test1");
System.out.println(file.getAbsoluteFile());    // d:\test\test1
File file = new File((File) null, "test");
System.out.println(file.getAbsoluteFile());    // E:\...test

 3.2.3 File(File parent, String child)

  从父抽象路径名和子路径名字符串创建新的 File 实例。

  • File(String parent, String child)用法一致,只是父类的参数为抽象文件名。

  • 内部源码

public File(File parent, String child) {
        if (child == null) {
            throw new NullPointerException();
        } else {
            if (parent != null) {
                if (parent.path.equals("")) {
                    this.path = fs.resolve(fs.getDefaultParent(), fs.normalize(child));
                } else {
                    this.path = fs.resolve(parent.path, fs.normalize(child));
                }
            } else {
                this.path = fs.normalize(child);
            }

            this.prefixLength = fs.prefixLength(this.path);
        }
    }
  • 代码测试
File file = new File(new File("d:\\test"), "test.txt");
System.out.println(file.getAbsoluteFile());    // d:\test\test.txt

 3.2.4 getName()

  返回此抽象路径名表示的文件或目录的 名称 (最后一个名称)。 如果路径名的名称序列为空,则返回空字符串。

  • 内部源码
public String getName() {
        int index = this.path.lastIndexOf(separatorChar);
        return index < this.prefixLength ? this.path.substring(this.prefixLength) : this.path.substring(index + 1);
    }
  • 代码测试
File file = new File("test.txt");
System.out.println(file.getName());    // test.txt

 3.2.4 getParent()

  返回此抽象路径名 路径名字符串,如果此路径名未指定父目录,则返回null 。

  • 抽象路径名的 父节点 包含路径名的前缀(如果有),以及路径名的名称序列中的每个名称(除了最后一个)。如果名称序列为空,则路径名不会命名父目录。

  • public File getParentFile() 方法一致,只是返回的是 File 对象

  • 内部源码

public String getParent() {
        int index = this.path.lastIndexOf(separatorChar);
        if (index < this.prefixLength) {
            return this.prefixLength > 0 && this.path.length() > this.prefixLength ? this.path.substring(0, this.prefixLength) : null;
        } else {
            return this.path.substring(0, index);
        }
    }
  • 代码测试
File file = new File("d:\\", "test.txt");
System.out.println(file.getParent());    // d:\
File file = new File("test.txt");
System.out.println(file.getParent());    // null

 3.2.5 getPath()

  将此 抽象路径名 转换为 路径名字符串。 生成的字符串使用 default name-separator character 分隔名称序列中的名称。

  • 内部源码
public String getPath() {
        return this.path;
    }
  • 代码测试
File file = new File("d:\\test.txt");
System.out.println(file.getPath());    // d:\test.txt

 3.2.6 isAbsolute()

  测试此抽象路径名是否为 绝对路径。 绝对路径名的定义取决于系统。 在UNIX系统上,如果路径名的前缀为"/" ,则路径名是绝对路径。 在Microsoft Windows系统上,如果路径名的前缀是驱动器说明符后跟"\\" ,或者前缀为"\\\\" ,则路径名是绝对路径名。

  • 内部源码
public boolean isAbsolute() {
        return fs.isAbsolute(this);
    }
  • 代码测试
File file = new File("d:\\test.txt");
System.out.println(file.isAbsolute());    // true
File file = new File("test.txt");
System.out.println(file.isAbsolute());    // false

 3.2.7 getAbsolutePath()

  返回此抽象路径名的 绝对路径名字符串。如果此抽象路径名已经是绝对路径名,则只需返回路径名字符串,就好像通过 getPath()方法一样。

  • 如果此抽象路径名是空抽象路径名,则返回当前用户目录的路径名字符串,该字符串由系统属性user.dir命名。

  • 否则,此路径名将以与系统相关的方式解析:

在UNIX系统上,通过将相对路径名解析为当前用户目录,使其成为绝对路径名。

在Microsoft Windows系统上,通过将路径名解析为路径名所指定的驱动器的当前目录(如果有),使相对路径名成为绝对路径名。 如果没有,则针对当前用户目录解析。

  • 内部源码
 public String getAbsolutePath() {
        return fs.resolve(this);
    }
  • 代码测试
File file = new File("test.txt");
System.out.println(file.getAbsolutePath());    // E:...test.txt
File file = new File("");
System.out.println(file.getAbsolutePath());    // E:...deal_bigint

 3.2.8 getAbsoluteFile()

  返回此 抽象路径名的绝对形式。 相当于new File(this.getAbsolutePath())

  • 内部源码
public File getAbsoluteFile() {
        String absPath = this.getAbsolutePath();
        return new File(absPath, fs.prefixLength(absPath));
    }
  • 代码测试
File file = new File("test.txt");
System.out.println(file.getAbsoluteFile());    // E:...test.txt

 3.2.9 exists()

  测试此抽象路径名表示的文件或目录 是否存在

  • true 当且仅当此抽象路径名表示的文件或目录存在时; 否则为 false

  • 内部源码

public boolean exists() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(this.path);
        }

        if (this.isInvalid()) {
            return false;
        } else {
            return (fs.getBooleanAttributes(this) & 1) != 0;
        }
    }
  • 代码测试
File file = new File("test.txt");
System.out.println(file.exists());    // false
file.mkdir();
System.out.println(file.exists());    // true

 3.2.10 mkdir()

  创建 此抽象路径名指定的目录,不能创建包含不存在的父类目录的文件。

  • true 当且仅当目录已创建时; 否则为 false

mkdirs() 创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。

  • 内部源码
public boolean mkdir() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkWrite(this.path);
        }
        return this.isInvalid() ? false : fs.createDirectory(this);
    }
  • 代码测试
File file = new File("test.txt");
System.out.println(file.mkdir());    // false 文件已经存在无法再创建
File file = new File("test.txt");
System.out.println(file.mkdir());    // false 文件不存在,创建返回

 3.2.11 list()

  返回一个字符串数组,用于表示此抽象路径名表示的 目录中文件和目录

  • 如果此抽象路径名不表示目录,则此方法返回null 。 否则返回一个字符串数组,一个用于目录中的每个文件或目录。 表示目录本身的名称和目录的父目录不包含在结果中。 每个字符串都是文件名而不是完整路径。

    无法保证结果数组中的名称字符串将以任何特定顺序出现; 特别是,它们不能保证按字母顺序出现。

  • 内部源码

public String[] list() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(this.path);
        }
        return this.isInvalid() ? null : fs.list(this);
    }
  • 代码测试
File file = new File("E:\\file");
    for (String temp: file.list()) {
        System.out.println(temp);
    }
/*
conscription work
java learn
object file
plan and activity
python learning
python test
vc++monitor system
web
...
*/

 3.2.12 list(FilenameFilter filter)

  返回一个字符串数组,用于表示由此抽象路径名表示的目录中的文件和目录,满足指定的过滤器。

  • 此方法的行为与 list() 方法的行为相同,只是返回的数组中的字符串必须满足过滤器。

  • 如果给定的filter是null则接受所有名称。 否则,当且仅当在此抽象路径名上调用过滤器的FilenameFilter.accept(File, String) 方法以及其表示的目录中的文件或目录的名称时,才会生成值true的名称。

  • 内部源码

public String[] list(FilenameFilter filter) {
        String[] names = this.list();
        if (names != null && filter != null) {
            List<String> v = new ArrayList();

            for(int i = 0; i < names.length; ++i) {
                if (filter.accept(this, names[i])) {
                    v.add(names[i]);
                }
            }

            return (String[])v.toArray(new String[v.size()]);
        } else {
            return names;
        }
    }
  • 代码测试
public static void main(String[] args) {
        File file = new File("E:\\file");
        for (String temp: file.list(new FilenameFilter(){
            @Override
            public boolean accept(File file, String s) {
                // 输出文件名小于 15 的文件
                if (s.length() < 15)
                    return true;
                return false;
            }
        })) {
            System.out.println(temp);
        }
    }
/*
java learn
object file
python test
web
*/

listFiles()listFiles(FilenameFilter filter)功能类似,只是返回的是抽象路径名。