java之文件夹遍历
2016-01-23 23:33
501 查看
使用java实现文件的便利其实很简单应为java已经在File对象中提供了list()方法,使用这个方法我们可以很容易的获取此文件夹的下一层文件目录
但是对于文件的遍历还是有些不方便
而且在创建文件夹目录树时还是很不便的
今天分享一下我的文件遍历工具
Util:
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的树还是比较好看和好控制的)
但是对于文件的遍历还是有些不方便
而且在创建文件夹目录树时还是很不便的
今天分享一下我的文件遍历工具
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的树还是比较好看和好控制的)
相关文章推荐
- Java反射机制
- java学习之线程的操作方法
- java并发编程——ExecutorService\join\yield
- java学习之IO装饰设计模式
- [JavaEE]JaveEE遇到的的问题
- java学习之IO文件分割
- java学习之IO对象流
- java中的String类常量池详解
- java学习之实现文件的复制
- java学习之字符流与字节流的转换
- java学习之IO字符流
- Java学习之IO字节流
- java学习之二叉树的实现
- MyBatis——MyEclipse中使用mybatis-generator
- [Java]泛型方法思路整理
- JavaSE-接口应用举例
- Java学习之链表
- SpringMvc 之自动注解
- java之注解
- Eclipse打包jar文件