使用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的树还是比较好看和好控制的)