Java I/O学习——File

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]

  

 

posted @ 2013-11-25 21:47  E_star  阅读(363)  评论(0编辑  收藏  举报