java之文件夹遍历

使用java实现文件的便利其实很简单应为java已经在File对象中提供了list()方法,使用这个方法我们可以很容易的获取此文件夹的下一层文件目录

但是对于文件的遍历还是有些不方便

而且在创建文件夹目录树时还是很不便的

今天分享一下我的文件遍历工具

Util:

public class TravaseringFolder {

	
	public TravaseringFolder() {
		level = 0;
		maxLevel = 0;
		
	}
	
	/**
	 * 为了树状显示将同一层的file封装到同一个list中(延迟加载时使用)
	 * @return
	 */
	public List<File> getOneFileList(File file) {
		File[] files ;
		if (file.isFile() || 0 == file.listFiles().length) {
			return null;
		} else {
			files = file.listFiles();
			files = sort(files);
		}
		return Arrays.asList(files);
	}
	
	/* 遍历获取文件list */
	// 用于判断目录或文件所处的层次
	private static int level;
	public static int maxLevel;
	
	public int getMaxLevel() {
		return maxLevel;
	}
	
	/**
	 * 只是给FileMap用的
	 * @author JiangGengChao
	 */
	public class FileMapKeyNode {
		private int level;
		private File me;
		public int getLevel() {
			return level;
		}
		public File getMe() {
			return me;
		}
		public FileMapKeyNode(int level, File me) {
			this.level = level;
			this.me = me;
		}
		@Override
		public String toString() {
			return "FileNode [level=" + level + ", me=" + me + "]";
		}
		
	}
	private static Map<FileMapKeyNode, List<FileNode>> fileMap = new HashMap<FileMapKeyNode, List<FileNode>>();

	public Map<FileMapKeyNode, List<FileNode>> getFileMap() {
		return fileMap;
	}

	public void setRoot(File rootFile) {
		List<FileNode> rootFileList = new ArrayList<FileNode>();
		rootFileList.add(new FileNode(0, null, rootFile));
		getFileMap().put(new FileMapKeyNode(-1, null), rootFileList);
	}
	/**
	 * 递归遍历文件夹(获取所有层级的list)
	 * @param file
	 */
	public void deepList(File file) {
		if (file.isFile() || 0 == file.listFiles().length) {
			return;
		} else {
			FileMapKeyNode keyNode = new FileMapKeyNode(level, file);
			addFileMap(keyNode, getSameFatherList(file));
			
			for (File f : file.listFiles()) {
				if (f.isDirectory()) {
					level++;
					
					if(level> maxLevel)
						maxLevel = level;
					
					deepList(f);
					
					level--;
				}
			}
		}
	}
	
	/**
	 * 获取一个目录下的同层FileNode列表
	 * @param file
	 * @return
	 */
	private List<FileNode> getSameFatherList(File file) {
		List<FileNode> list = new ArrayList<FileNode>();
		if (file.isFile() || 0 == file.listFiles().length) {
			return null;
		} else {
			File[] files = file.listFiles();
			files = sort(files);
			for(File temp : files) {
				FileNode fileNode = new FileNode(level, file, temp);
				list.add(fileNode);
			}
		}
		return list;		
	}
	
	/**
	 * 添加FileMap
	 * @param father
	 * @param sameFatherList
	 */
	private void addFileMap(FileMapKeyNode keyNode, List<FileNode> sameFatherList) {
		fileMap.put(keyNode, sameFatherList);
	}
	
	/**
	 * 通过子FileNode找到父FileNode
	 * @param fileNode
	 * @return
	 */
	public FileNode getFileNodeByFatherFile(FileNode fileNode) {
		FileNode targetFileNode = null;
		for(List<FileNode> fileNodeList : fileMap.values()) {
			for(FileNode fileNodeTemp : fileNodeList) {
				if(fileNodeTemp.getMe().getPath().equals(fileNode.getFather().getPath()))
					targetFileNode = fileNodeTemp;
			}
		}
		return targetFileNode;
	}
	
	/**
	 * 递归遍历文件夹(控制台显示)
	 * @param file
	 */
	public void deepListForConsole(File file) {
		if (file.isFile() || 0 == file.listFiles().length) {
			return;
		} else {
			File[] files = file.listFiles();

			files = sort(files);

			for (File f : files) {
				StringBuffer output = new StringBuffer();

				if (f.isFile()) {
					output.append(getTabs(level));
					output.append(f.getName());
				} else {
					output.append(getTabs(level));
					output.append(f.getName());
					output.append("//");
				}

				System.out.println(output);

				if (f.isDirectory()) {
					level++;

					deepListForConsole(f);

					level--;

				}
			}
		}
	}

	/**
	 * 添加tab(控制台测试用)
	 * @param level
	 * @return
	 */
	private String getTabs(int level) {
		StringBuffer buffer = new StringBuffer();

		for (int i = 0; i < level; i++) {
			buffer.append("/t");
		}

		return buffer.toString();
	}
	
	/**
	 * 整理单层文件的排放顺序(全局使用)
	 * @param files
	 * @return
	 */
	private File[] sort(File[] files) {
		List<File> sorted = new ArrayList<File>();

		// 寻找到所有的目录
		for (File f : files) {
			if (f.isDirectory()) {
				sorted.add(f);
			}
		}
		// 寻找到所有的文件
		for (File f : files) {
			if (f.isFile()) {
				sorted.add(f);
			}
		}
		return sorted.toArray(new File[files.length]);
	}
}

FileNode(自定义文件节点类其中封装了文件的层级,父节点,自己):

public class FileNode {
	private int level;
	private File father;
	private File me;
	public int getLevel() {
		return level;
	}
	public File getFather() {
		return father;
	}
	public File getMe() {
		return me;
	}
	public FileNode(int level, File father, File me) {
		this.level = level;
		this.father = father;
		this.me = me;
	}
	@Override
	public String toString() {
		return "FileNode [level=" + level + ", father=" + father + ", me=" + me + "]";
	}
	
}

这是工具可以理解为后台的操作,使用此工具就可以很轻松的实现一个文件夹的遍历,但对于文件夹树的创建还有很多要做的后面有空介绍文件夹tree的创建
(我是使用twaver的ttree建的因为twaver的树还是比较好看和好控制的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值