Java IO之File类详解

定义:

  1. File类在java.io包下,是java对文件和目录的抽象,用于操作文件或目录,比如创建、删除、执行等等。
  2. File类的实例一旦创建就不可改变的,也就是说File类的实例是对a文件的抽象,一旦创建,就不可改变成对其他文件的抽象,只能对a文件。

API讲解:

属性讲解:
//依赖于系统的文件路径分隔符,会随着操作系统的不同而不同,在windows系统上是\,linux系统上是/。
public static final char separatorChar;

//依赖于系统的文件路径分隔符,上面是字符型,这个是字符串类型,会随着操作系统的不同而不同,在windows系统上是\,linux系统上是/。
public static final String separator;

//上面属性两个示例:
//一个文件路径可表示为  "xx" + separator + "xxx" + separator + "xxxx"
//windows:   C:\\xx\\xxx\\xxxx ,使用双反斜杠\\因为反斜杠\是转义特殊字符,所以要用前面的反斜杠把后面的反斜杠转义成普通字符。
//linux:/xxx/xxx/xxxxx


//依赖于操作系统的多个文件路径的分隔符,在window上是 ; ,在linux上是 : 。
public static final char pathSeparatorChar;

//依赖于操作系统的多个文件路径的分隔符,在window上是 ; ,在linux上是 : 。
public static final String pathSeparator;

//上面多个文件路径示例:
// "xx" + separator + "xxx" + separator + "xxxx" + pathSeparator + "aa" + separator + "aaa" + separator + "aaaa"
//windows: C:\\xx\\xxx\\xxxx;C:\\aa\\aaa\\aaaa 表示两个文件的路径 //查看环境变量的路径也可看出是使用分号分隔。
//linux: /xx/xxx/xxxx:/aa/aaa/aaaa  //使用echo $PATH 查看多个路径使用冒号分隔。

**总结:**使用这两个属性(这4个属性实际上是两个属性)可以实现动态指定文件路径分隔符和多文件路径分隔符,使得代码可以不用修改而运行在不同的操作系统上。

构造器讲解:

/**
*可以指定上级目录
*parent:上级目录的file抽象,必须要为目录并且目录存在,否则就是抛出异常。
*child:子路径,可以直接指定文件名,也可以指定目录+文件
*最终生成的文件路径为parentPath + childPath
*
public File(File parent, String child)

//直接指定路径生成文件或目录
public File(String pathname)

//跟第一个构造器相似,只是parent从File对象改为String对象。
public File(String parent, String child)

//通过将给定的File:URI转换为抽象路径名来创建新的文件实例。使用file协议。
public File(URI uri)

//输入的路径可以是绝对路径也可以是相对路径。
方法API讲解:
//对File实例所设置的文件路径创建一个空白文件,当且仅当该路径上的设置文件不存在时才会创建,
//并且创建该文件的过程是一个原子操作。返回true说明创建了文件,false说明没有创建。
public boolean	createNewFile();

/**
*在系统默认的临时文件夹中创建一个临时文件。
*prefix:文件名前缀。
*suffix:文件名后缀。
* 生成的临时文件名为:prefix + 一串数字 + suffix
* 改方法是一个类方法,可以直接File.createTempFile(prefix,suffix)调用。
* 返回创建的临时文件File实例。
*/
public static File	createTempFile(String prefix, String suffix);

//与上面的方法一样,只是它可以指定临时文件生成的目录。
public static File createTempFile(String prefix, String suffix, File directory);

//删除该File实例表示的文件或者目录。返回true表示删除成功,false表示失败。
//删除目录时只有该目录下没有任何文件或者子目录才能删除成功。
public boolean	delete();

//调用了该方法不会立即删除文件或者目录,当虚拟机正常终止时(非正常终止不会进行)会进行文件或者目录的删除。
//删除目录时只有该目录下没有任何文件或者子目录才能删除成功。
public void	deleteOnExit();

//判断obj对象的抽象路径名与该file实例的抽象路径名是否相等。
//返回true的情况是obj!=null 并且 obj属于File类,并且obj对象的抽象路径名与该file实例的抽象路径名相等。
//windows系统的文件是大小写不敏感,而unix系统时大小写敏感的,这个要注意。
public boolean equals(Object obj);

//与equals方法类似,判断两个File实例的抽象路径名称是否一致。一致返回0,否则返回-1。
public int	compareTo(File pathname)

//判断该File实例表示的文件或者目录是否存在,存在返回true,不存在返回false。
public boolean exists();

//获取该文件的绝对路径。
public String	getAbsolutePath();

//返回用绝对路径创建的File实例,file.getAbsoluteFile();相当于new File(file.getAbsolutePath())
public File	getAbsoluteFile();

//返回文件或目录的既绝对,又规范的路径名。
//规范是依赖于操作系统的,比如windows系统规范路径是盘符要大写的。所以new File("d:\\aa")的规范路径是D:\\aa。比如在Unix系统上,从路径名中删除多余的名称,如“.”和“.”,解析符号链接。
//一个文件的表示路径有很多种。
//比如表示/root/a.txt文件。路径表示的方法有/root/a.txt、在/root目录下表示a.txt,在/root/aa目录下可以表示../a.txt、在/opt目录下表示../root/a.txt。但是一个文件的规范绝对路径只能有一种,是惟一的。

//规范路径:D:\AAAAddd\80AAss.txt  这个也是绝对路径
//绝对路径:d:\AAAAddd\80AAss.txt
public String getCanonicalPath();

//返回用规范路径创建的File实例,file.getAbsoluteFile();相当于new File(file.getCanonicalPath())
public File getCanonicalFile()

//返回file实例路径所在分区的空闲空间大小,单位字节。
//file实例的抽象路径对应的文件或者目录如果不存在就返回0.
public long getFreeSpace();

//返回file实例的文件或目录名,不包含上级目录,比如/home/yns/a.txt会返回a.txt。
public String	getName();

//返回该file实例的父目录路径名,如果没有父目录则返回null。这个路径取决于创建file实例时传入的路径。
//new File("C:\\dd\\aa\\c.txt").getParent(); 返回C:\\dd\\aa
//new File("dd\\aa\\c.txt").getParent(); 返回dd\\aa
//new File("c.txt").getParent(); 返回null,这种是没有父目录的情况。
public String getParent();

//获取file实例表示的路径,这个路径就是我们创建file实例是构造器传入的路径。
//new file("aa.txt") 返回aa.txt
//new file("dd\\aa\\aa.txt") 返回dd\\aa\\aa.txt
//new file("d:\\aa\\aa.txt") 返回d:\\aa\\aa.txt
//new file("aa\\dd\\cc","ee\\aa.txt") 返回aa\\dd\\cc\\ee\\aa.txt
public String getPath();

//返回file实例路径所在分区的总空间大小,单位字节。
//file实例的抽象路径对应的文件或者目录如果不存在就返回0.
public long getTotalSpace()

//返回file实例的抽象路径是不是绝对路径,是就返回true,否则返回false。
//这个判断是依赖于操作系统的比如windows系统的绝对路径是从盘符开始,unix系统以/开头。
public boolean isAbsolute();

//判断该file实例表示的是不是目录,是就返回true,否则返回false。
//当且仅当file实例表示的文件存在并且是目录时返回true。
public boolean isDirectory()

//判断该file实例表示的是不是普通,是就返回true,否则返回false。
//当且仅当file实例表示的文件存在并且不是目录并且满足系统其它相关条件时返回true。
//Java应用程序创建的任何非目录文件都保证是普通文件。
public boolean isFile();

//判断file实例表示文件是不是隐藏文件。
//返回true的前提是该file实例表示的文件或目录必须存在。
//这个判断依赖于系统,比如windows系统要设置标记为隐藏文件,unix系统用.开头的文件表示隐藏文件。
public boolean isHidden();

//获取file实例表示的文件最后修改的时间,是一个时间戳,如果文件不存在返回0.
public long lastModified();

//获取file实例表示的文件或者目录的大小,单位字节,如果文件或者目录不存在返回0。
public long length();

//返回file实例表示的目录下的文件和目录(不包括子目录)名称数组。每个字符串都是一个文件名,而不是完整的路径。
//如果file实例表示的不是目录或者表示的文件不存在,就返回null。
//无法保证结果数组中的名称字符串将以任何特定的顺序出现;尤其不能保证它们按字母顺序出现。
public String[] list();

//与list()方法类似,不过返回是File实例数组
public File[] listFiles()

//获取系统可用的根目录的file实例。
//依赖于系统 比如windows系统中盘符就是根目录,可能会有c: 、d:等根目录。unix系统中只有一个根目录/。
//也受外部硬件环境的影响,比如你插了个u盘就会显示多一个根目录。
//静态方法,可File.listRoots();直接调用。
public static File[] listRoots();

//创建一个file实例表示的路径的目录。
//当file实例表示的路径文件不存在时才会进行创建。
//不支持递归创建,比如该路径的父目录不存在时,就会创建失败。
//创建成功返回true。失败返回false。
public boolean mkdir();

//递归创建目录。
//如果此操作失败,也有可能已成功创建了一些必需的父目录。
//如果且仅当目录与所有必需的父目录一起创建时为true;否则为false
public boolean mkdirs();

//将file实例代表的文件或者目录重命名,或者说文件目录移动。成功返回true。
//文件不存在时返回false。
//移动到的目录必须存在,否则返回false。
public boolean renameTo(File dest);

//就是getPath();
 public String toString() {
        return getPath();
    }


一些要演示的api:


//与list()方法类似,不过它传入一个文件名过滤器FilenameFilter 。可以对文件进行过滤。
public String[] list(FilenameFilter filter);

//与listFiles()方法类似,不过它传入一个文件名过滤器FilenameFilter 。可以对文件进行过滤。
public File[] listFiles(FilenameFilter filter)

演示代码:


public class FileDemo {
    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
        fun();
    }

    /**
     * 文件名过滤器,过滤以a开头的文件
     */
    private static class MyFilenameFilter implements FilenameFilter{

        //实现FilenameFilter自定义过滤器Retry,并重写accept
        @Override
        public boolean accept(File dir, String name) {
            //会过滤掉返回false的文件或者目录
            if(name.startsWith("a"))
                return false;
            return true;
        }
    }

    private static MyFilenameFilter myFilenameFilter = new MyFilenameFilter();

    public static void fun() throws IOException, URISyntaxException, InterruptedException {

        File file = new File("D:\\baiduyun");
        System.out.println(Arrays.toString(file.list(myFilenameFilter)));

        System.out.println(Arrays.toString(file.listFiles(myFilenameFilter)));
    }
}

目录下的文件:
在这里插入图片描述
执行结果:
在这里插入图片描述
解析:以a开头的文件或者目录被过滤了。


//与listFiles()方法类似,不过它传入了一个FileFilter 过滤器,过滤掉一定条件的文件或者目录。
public File[] listFiles(FileFilter filter);

演示:

public class FileDemo {
    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
        fun();
    }

   

    
    public static void fun() throws IOException, URISyntaxException, InterruptedException {

        File file = new File("D:\\baiduyun");
        //过滤掉目录和大于10个字节的文件
        System.out.println(Arrays.toString(file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                //过滤掉目录
                if (pathname.isDirectory())
                    return false;
                //过滤掉大小大于10个字节的文件
                if (pathname.length()>10)
                    return false;
                return true;
            }
        })));
    }
}

执行结果(目录文件看上图):
在这里插入图片描述

File类讲解到此结束。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值