如果我需要列出某个目录下的所有文件夹和文件,那我就需要对这个目录进行递归。对目录进行递归的思想很简单:每个目录底下都可能有文件或者文件夹,文件和文件夹的区别就是名称否包含”/”,只要当前的文件夹下还包含文件夹我就必须一直遍历下去,递归的终点就是遇到文件或者空文件夹。递归无非就是方法的自调用,找到通用点以及方法的自调用点,结束点,递归还是很容易实现的,递归本质上是对方法做while循环。
原理很简单,下面就是代码部分:
/** * * @author 水货程序员 */ public class FileSystem { public Hashtable table = new Hashtable(); public int level = 1; public void getTreeList(String path) { try { FileConnection fc = (FileConnection) Connector.open(path, Connector.READ); Enumeration enums = fc.list(); Vector folderVector = new Vector(); while (enums.hasMoreElements()) { String name = enums.nextElement().toString(); //我这里把name作为key,level作为value,本末倒置,但是读取数据的时候还是很方便的。 //这里我声明一个level变量,有点参照oracle中level的意思,level用来区分文件或文件夹属于哪一级。 table.put(name, new Integer(level)); //判断是否为文件夹 if (name.indexOf("/") > 0) { folderVector.addElement(name); } } int size = folderVector.size(); //如果没到最底端 if (size > 0) { level ++; for (int i = 0; i < size; i++) { String tmpPath = path + folderVector.elementAt(i).toString(); //这里就是递归点 getTreeList(tmpPath); } }else{ //这里就是结束点 return; } } catch (IOException ex) { ex.printStackTrace(); } } }
import com.sun.lwuit.Button; import com.sun.lwuit.Form; import com.sun.lwuit.layouts.BoxLayout; import com.thinkrace.UCHome.file.FileSystem; import java.util.Enumeration; /** * * @author 水货程序员 */ public class FileListForm extends Form { FileSystem fs = new FileSystem(); public FileListForm() { setLayout(new BoxLayout(BoxLayout.Y_AXIS)); testFileRecurse(); show(); } /** * 测试文件递归 */ public void testFileRecurse() { String path = "file:///c:/data/"; fs.getTreeList(path); //由于我的本末倒置,Hashtable中的key存的是文件或文件夹的名称,value存的是级别 Enumeration enums = fs.table.keys(); while(enums.hasMoreElements()){ String name = enums.nextElement().toString(); Button b = new Button(name); addComponent(b); } } }