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

在学习那些真正用于在流中读写数据的类之前,我们先来学习一个帮助我们处理文件目录问题的类,即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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值