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]

  

 

你可能感兴趣的:(java)