File类
java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类。它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑。对文件的真正操作,还得需要I/O流的实现。
1.目录列表
如果我们想查看某个目录下有那些文件和目录,我们可以使用File中提供的list方式来查看,这很像linux下的ls命令。
查看E:/html文件夹下所有的php文件,执行的时候输入的参数为正则表达式
package com.dy.xidian; import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern; public class DirList {
static File path = new File("E:/html");
public static void main(String[] args) {
String[] list;
// 获取整个目录列表
if (args.length == 0)
list = path.list();
else
list = path.list(new DirFilter(args[0]));
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
for (String string : list) {
System.out.println(string);
}
}
} class DirFilter implements FilenameFilter {
private Pattern pattern;
public DirFilter(String regex) {
pattern = Pattern.compile(regex);
} public boolean accept(File dir, String name) {
// find匹配的是字符串的子序列,我们可以认为是不严格匹配
return pattern.matcher(name).find();
}
}
2.目录实用工具
该工具有两个作用
- 遍历所有目录及其子目录
- 遍历目录下的文件以及其子目录下的文件
package com.dy.xidian; import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern; import net.mindview.util.PPrint; public final class Diractory {
public static File[] local(File dir, final String regex) {
return dir.listFiles(new FilenameFilter() {
Pattern pattern = Pattern.compile(regex);
@Override
public boolean accept(File dir, String name) {
return pattern.matcher(new File(name).getName()).matches();
}
});
} public static File[] local(String path, final String regex) {
return local(new File(path), regex);
} public static class TreeInfo implements Iterable<File> {
public List<File> files = new ArrayList<File>();
public List<File> dirs = new ArrayList<File>(); @Override
public Iterator<File> iterator() {
return files.iterator();
} void addAll(TreeInfo other) {
files.addAll(other.files);
dirs.addAll(other.dirs);
} public String toString() {
return "dirs: " + PPrint.pformat(dirs) + "\n\nfiles:"
+ PPrint.pformat(files);
}
} public static TreeInfo walk(String start, String regex) {
return recurseDirs(new File(start), regex);
} public static TreeInfo walk(File start, String regex) {
return recurseDirs(start, regex);
} public static TreeInfo walk(File start) {
return recurseDirs(start, ".*");
} public static TreeInfo walk(String start) {
return recurseDirs(new File(start), ".*");
} public static TreeInfo recurseDirs(File startDir, String regex) {
TreeInfo result = new TreeInfo();
for (File file : startDir.listFiles()) {
if (file.isDirectory()) {
result.dirs.add(file);
result.addAll(recurseDirs(file, regex)); //加入子目录信息
} else if (file.getName().matches(regex))
result.files.add(file);
}
return result;
} public static void main(String[] args) {
if (args.length == 0)
System.out.println(walk("."));
else
for (String arg : args) {
System.out.println(walk(arg));
}
}
}
3.目录的检查及创建
File的更倾向于对目录、文件属性的操作,比如路径,存在性,大小,修改时间、读/写权限等,对文件的内容并不关心。
package com.dy.xidian; import java.io.File; public class MakeDirectories {
private static void usage() {
System.err.println("Usage: MakeDirectories path1...\n"
+ "Creates each path\n"
+ "Usage: MakeDirectories -d path1...\n" + "Delete each path\n"
+ "Usage: MakeDirectories -r path1 path2\n"
+ "Renames from path1 to path2");
System.exit(1);
} private static void fileData(File f) {
System.out.println("Absolute path: " + f.getAbsolutePath()
+ "\n Can read: " + f.canRead() + "\n Can write: "
+ f.canWrite() + "\n getName: " + f.getName()
+ "\n getParent: " + f.getParent() + "\n getPath: "
+ f.getPath() + "\n length: " + f.length()
+ "\n lastModified: " + f.lastModified());
if (f.isFile())
System.out.println("It is a file");
else if (f.isDirectory())
System.out.println("It is a directory");
} public static void main(String args[]) {
if (args.length < 1)
usage();
if (args[0].equals("-r")) {
if (args.length != 3)
usage();
//文件重命名,若文件名冲突,则命名函数执行失败
File old = new File(args[1]), rname = new File(args[2]);
old.renameTo(rname);
fileData(old);
fileData(rname);
return;
}
int count = 0;
boolean del = false;
if (args[0].equals("-d")) {
count++;
del = true;
}
count--;
while (++count < args.length) {
File f = new File(args[count]);
if (f.exists()) {
System.out.println(f + " existd");
if (del) {
System.out.println("deleting..." + f);
f.delete();
}
} else if (!del) {
f.mkdirs();
System.out.println("create " + f);
}
fileData(f);
}
}
}
该代码能够进行目录/文件的创建,删除,重命名操作.