您的位置:首页 > 编程语言 > Java开发

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

2016-08-22 23:00 169 查看
在学习那些真正用于在流中读写数据的类之前,我们先来学习一个帮助我们处理文件目录问题的类,即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()

返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: