Java I/O学习——File

时间:2022-06-26 14:03:14

File我们出看可能会根据字面意思理解为文件,其实它既代表文件又代表目录。

这里有一个例子可以列出指定目录下的所有文件或目录, 以及我们可以过滤得到我们想要的文件

import java.io.File;
import java.io.FilenameFilter;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern; class DirFilter implements FilenameFilter{ private Pattern pattern;
public DirFilter(String regex){
pattern = Pattern.compile(regex);
}
@Override
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
} }
public class Test{ public static void main(String[] args) {
File path = new File("/home/estar/Test"); String[] list = path.list();
System.out.println("输出全部文件或目录:");
for (String s : list) {
System.out.println(s);
}
System.out.println("输出以.java结尾的文件或目录");
list = path.list(new DirFilter(".*\\.java")); //只列出以.java结尾的文件
for (String s : list) {
System.out.println(s);
} System.out.println("匿名内部类实现");
list = path.list(new FilenameFilter() { @Override
public boolean accept(File dir, String name) {
Pattern pattern = Pattern.compile(".*\\.java");
return pattern.matcher(name).matches();
}
});
for (String s : list) {
System.out.println(s);
}
}
}
输出:
输出全部文件或目录:
a.java
cd
e.txt
b.java
c.java
d.java
输出以.java结尾的文件或目录
a.java
b.java
c.java
d.java
匿名内部类实现
a.java
b.java
c.java
d.java

  

更加实用的工具类:

import java.io.File;
import java.io.FilenameFilter;
import java.io.ObjectInputStream.GetField;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern; class FileUtils{
//获得本地指定目录下的,指定格式的目录列表
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 dir, String name) {
return local(new File(dir), name);
} public static class TreeInfo implements Iterable<File> { List<File> files = new ArrayList<File>();
List<File> dirs = new ArrayList<File>();
public void addAll(TreeInfo info) {
files.addAll(info.files);
dirs.addAll(info.dirs);
} @Override
public Iterator<File> iterator() {
return files.iterator();
}
@Override
public String toString() {
return files.toString() + "\n" + dirs.toString();
}
} //得到所有目录
public static TreeInfo getInfo(String path, String regex) {
return recurseDirs(new File(path), regex);
}
public static TreeInfo getInfo(File path, String regex) {
return recurseDirs(path, regex);
}
public static TreeInfo getInfo(String path) {
return recurseDirs(new File(path), ".*");
}
public static TreeInfo getInfo(File path) {
return recurseDirs(path, ".*");
} //递归调用然后获得信息
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 {
//System.out.println("item : = " + item);
if (item.getName().matches(regex)) {
result.files.add(item);
}
}
}
return result;
}
}
public class Test{ public static void main(String[] args) {
System.out.println(Arrays.asList(FileUtils.local(new File("/home/estar/Test"), ".*\\.java")));
System.out.println("指定目录下的所有目录:");
System.out.println(FileUtils.getInfo(new File("/home/estar/Test")).dirs);
System.out.println("指定目录下的所有文件:");
System.out.println(FileUtils.getInfo("/home/estar/Test").files);
System.out.println("指定目录下的所有内容:");
System.out.println(FileUtils.getInfo("/home/estar/Test")); System.out.println("指定目录下的,特定文件:");
System.out.println(FileUtils.getInfo(new File("/home/estar/Test"), ".*\\.java").files); }
} 输出:
[/home/estar/Test/a.java, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java]
指定目录下的所有目录:
[/home/estar/Test/cd]
指定目录下的所有文件:
[/home/estar/Test/a.java, /home/estar/Test/cd/q.java, /home/estar/Test/e.txt, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java]
指定目录下的所有内容:
[/home/estar/Test/a.java, /home/estar/Test/cd/q.java, /home/estar/Test/e.txt, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java]
[/home/estar/Test/cd]
指定目录下的,特定文件:
[/home/estar/Test/a.java, /home/estar/Test/cd/q.java, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java]