File(文件)既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。File类的实例是不可变的;也就是说,File对象表示的抽象路径名将不可改变。
利用目录过滤器获得一个受限文件列表,
import java.io.File;
import java.io.FilenameFilter;
//实现FilenameFilter接口
public class Filenamefilter implements FilenameFilter{
String regex=null;
public Filenamefilter(String regex){
this.regex=regex;
}
//接口中的方法,用于选取满足要求的文件
//其中,file指的是 目标文件路径path ,name指的是文件名
public boolean accept(File file,String name){
return name.startsWith(regex);
}
}
class DirList{
public static void main(String[] args) {
//文件目录
File path=new File("D:\\工作笔记");
//list方法会为此目录对象下的每个文件名调用accept()方法,判断该文件是否包含在内
String[] strList=path.list(new Filenamefilter("规则"));
for(String dirItem:strList){
System.out.println(dirItem);
}
}
}
//结果
规则有误分析1.png
规则有误分析2.png
利用匿名内部类进行改进:
class FileInnerNameFilter{
public static void main(String[] args) {
File path=new File("D:\\工作笔记");
//匿名类要直接使用该变量,因此要定义为final
final String regex="规则";
String[] strList=path.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith(regex);
}
});
for(String dirItem:strList){
System.out.println(dirItem);
}
}
}
产生给定目录下的整个目录树中所有的文件:
public class TreeInfo {
//分别保存文件和目录
List<File> files=new ArrayList<File>();
List<File> dirs=new ArrayList<File>();
public void addAll(TreeInfo other){
files.addAll(other.files);
dirs.addAll(other.dirs);
}
public static TreeInfo walk(String path,String regex){
return recurseDirs(new File(path),regex);
}
public static TreeInfo walk(File start,String regex){
return recurseDirs(start,regex);
}
//指定处的文件开始
public static TreeInfo recurseDirs(File startDir,String regex ){
TreeInfo result=new TreeInfo();
for(File item:startDir.listFiles()){
if(item.isDirectory()){
//添加当前目录
result.dirs.add(item);
//利用递归,从当前目录开始
result.addAll(recurseDirs(item,regex));
}else{
result.files.add(item);
}
}
return result;
}
}
File类的一些常用方法:
public class FileTest {
public static void main(String[] args) {
//判断指定的文件是否存在,不存在就创建
//unix平台,分隔符是/
//windows平台,分隔符是\
String url="D:\\GoogleMaps\\Egypt"+ File.separator+"\\test";
File dir=new File(url);
if(!dir.exists()){
//这是创建目录,而不是文件
//创建此抽象路径指定的目录,包括所有必需但不存在的父目录
System.out.println("创建目录:"+dir.mkdirs());
}
File file=new File(dir+File.separator+"test.txt");
try {
//只会适用创建文件本身,不包括父文件的创建(如果父文件不存在,需要判断)
System.out.println("创建文件:"+file.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件是否可读:"+file.canRead());
System.out.println("文件是否可写:"+file.canWrite());
System.out.println("绝对路径名:"+file.getAbsolutePath());
System.out.println("文件名:"+file.getName());
System.out.println("父目录:"+file.getParent());
System.out.println("是否是目录:"+file.isDirectory());
System.out.println("是否是文件:"+file.isFile());
System.out.println("最近一次被修改的时间:"+file.lastModified());
System.out.println("文件的长度:"+file.length());
//原来的文件不见了
System.out.println("移动文件(相当于重新命名):"+file.renameTo(new File(dir+File.separator+"newTest.txt")));
System.out.println("路径名字符串:"+file.toString());
System.out.println("文件删除:"+file.delete());
}
}
//结果:
创建目录:true
创建文件:true
文件是否可读:true
文件是否可写:true
绝对路径名:D:\GoogleMaps\Egypt\test\test.txt
文件名:test.txt
父目录:D:\GoogleMaps\Egypt\test
是否是目录:false
是否是文件:true
最近一次被修改的时间:1499951806477
文件的长度:0
移动文件(相当于重新命名):true
路径名字符串:D:\GoogleMaps\Egypt\test\test.txt
//因为文件被重命名,所以删除失败
文件删除:false