Java I/O系统详解(一)——File类

来源:互联网 发布:windows视频放大缩小 编辑:程序博客网 时间:2024/06/14 08:18

在学习那些真正用于在流中读写数据的类之前,我们先来学习一个帮助我们处理文件目录问题的类,即File类。


File类:

File类既能代表一个特定文件的名称,又能代表一个目录下一组文件的名称。
File类的功能我将它分为以下三点来介绍:
1.目录列表器: 如果我们想获得File对象包含的全部列表,我只需调用无参的list()方法。如果我们想或者一个受限(正则表达式)列表,那么我们就需要一个”文件名过滤器“,这个接口的accept方法告诉list方法是否显示某个文件名。
这里大家可能有点疑惑,accept方法怎么告诉list是否要显示该文件名呢?
我们先来看一下FilenameFilter接口的accept方法的API说明。

boolean accept(File dir,String name)
测试指定文件是否应该包含在某一文件列表中。
参数:dir - 被找到的文件所在的目录。 name - 文件的名称。

注意:由于FilenameFilter是一个接口,accept方法并没有被实现,所以你需要定义一个类实现这个接口,从而实现你自己想要的accept方法,将这个类的实例传递给list方法。
关于accept方法的实现我们等会再说,我们再来看一下list(FilenameFilter filter)方法是如何使用这个accept方法的,File类中的list(FilenameFilter filter)方法源代码如下:

public String[] list(FilenameFilter filter) {        String names[] = list();        if ((names == null) || (filter == null)) {            return names;        }        List<String> v = new ArrayList<>();        for (int i = 0 ; i < names.length ; i++) {            if (filter.accept(this, names[i])) {                v.add(names[i]);            }        }        return v.toArray(new String[v.size()]);    }

可见list方法认为只要list()中的文件名names[i]使accept方法返回true,那么就将这个文件名放入返回的数组之中。
现在,假如我们想在当前目录下找到后缀为.java的文件,那么我们就可以用下面的代码来实现:

import java.io.File;import java.io.FilenameFilter;import java.util.Arrays;import java.util.regex.Pattern;public class Dirlist {      public static void main(final String[] args) {        // TODO Auto-generated method stub        File path=new File(".");        String[] list=null;        if(args.length==0)            list=path.list();        else            list=path.list(new FilenameFilter() {                //编译正则表达式                private Pattern pattern = Pattern.compile(args[0]);                @Override                public boolean accept(File dir, String name) {                    //name整个字符串是否匹配正则表达式                    return pattern.matcher(name).matches();                 }            });        Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);        for(String s:list)            System.out.println(s);    }}//args[0]:"^.+\.(java)$"

注意代码中的采用匿名内部类实现FilenameFilter接口。由于传给匿名内部类的参数必须是final的,所以main函数的参数为final。

2.目录实用工具: 我们可以利用File的性质和FilenameFilter接口以及regex包中Pattern类和Macher类来获取某个目录下的满足要求的文件集。

3.File的其他常用功能: File不仅仅只代表存在的文件或目录,也可以用File对象来创建新的目录或尚不存在的整个目录路径。除此之外,我们还可以通过File查看文件的种种特性,检查某个File对象代表的是一个文件还是一个目录,并且还可以删除文件。下面给出常用方法的API:

boolean creatNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
boolean delete()
删除此抽象路径名表示的文件或目录。
File getAbsoluteFile()
返回此抽象路径名的绝对路径名形式。
String getName()
返回由此抽象路径名表示的文件或目录的名称。
boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。 表示文件最后一次被修改的时间的 long 值,用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示;如果该文件不存在,或者发生 I/O 错误,则返回 0L
boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
String toString()
返回此抽象路径名的路径名字符串。
boolean renameTo(File dest)
重新命名此抽象路径名表示的文件。
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

0 0