您的位置:首页 > 编程语言 > Java开发

java之文件夹遍历

2016-01-23 23:33 423 查看
使用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的树还是比较好看和好控制的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: