最近,上网搜java的编程题来做,遇到了这样的一道题:
编写一个Java应用程序,文件名为Folder.java,编译后执行结果如下图所示,实现指定文件夹下目录和文件的文本形式的树状结构显示。
要求:
1. 输入: java Folder,显示当前文件夹下的目录和文件的文本形式树状显示;
2. 输入: java Folder C:/test>,显示C:/test文件夹下的目录和文件的文本形式树状显示;(C:/test可以为任意文件夹路径名)
3. 输入: java Folder add aa,在当前文件夹下面添加一个子目录(子目录名为:aa),同时显示当前文件夹下的最新目录和文件的文本形式树状显示;
4. 输入: java Folder del aa,在当前文件夹下面删除一个子目录(子目录名为:aa),同时显示当前文件夹下的最新目录和文件的文本形式树状显示;
觉得这道题提有难度的,本来想看看答案,找了半天也没有,最后自己尝试把它写了出来,基本上实现了题目要求。不过可能代码质量不怎么样,请多多包涵!
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- public class Folder {
- public Folder(String title) {
- this.title = title;
- }
- private String title;
- private List children = new ArrayList();
- public void addChild(Folder f) {
- children.add(f);
- }
- public String getString(String lftStr, String append) {//递归
- StringBuilder b = new StringBuilder();
- b.append(append + title);
- b.append("/n");
- if (children.size() > 0) {
- for (int i = 0; i < children.size() - 1; i++) {
- b.append(lftStr + ((Folder) children.get(i)).getString(lftStr + "│", "├"));
- }
- b.append(lftStr + ((Folder) children.get(children.size() - 1)).getString(lftStr + " ","└"));
- }
- return b.toString();
- }
- public static void main(String[] args) {
- File file = new File(".//");//大前提,file为当前文件
- String currentPath = null;//当前目录
- try {
- currentPath =new String(file.getCanonicalPath());
- } catch (IOException e) {
- e.printStackTrace();
- }
- if(args.length == 0){
- /*
- * 1. 输入: java Folder,显示当前文件夹下的目录和文件的文本形式树状显示;
- */
- Folder root = new Folder(currentPath.substring(currentPath.lastIndexOf("//") +1 ));//依据当前目录获得根文件
- Tool.createTree(file.listFiles(), root);//生成一颗树
- System.out.println(root.getString(" ", ""));//打印树
- }else if(args.length == 1){
- /*
- * 2. 输入: java Folder C:/test>,显示C:/test文件夹下的目录和文件的文本形式树状显示;
- * (C:/test可以为任意文件夹路径名)
- */
- file = new File(args[0]);
- Folder root = new Folder(args[0].substring(args[0].lastIndexOf("//") +1));//依据args[]获得根文件
- Tool.createTree(file.listFiles(), root);
- System.out.println(root.getString(" ", ""));
- }else if(args.length == 2){
- if(args[0].equals("add")){
- /*
- * 3. 输入: java Folder add aa,在当前文件夹下面添加一个子目录(子目录名为:aa),
- * 同时显示当前文件夹下的最新目录和文件的文本形式树状显示;
- */
- //file = new File(".//");
- File addFile = new File(file,args[1]);
- boolean flag = false;
- if(addFile.isDirectory()){//是目录,就make
- flag = addFile.mkdir();
- }else if(addFile.isFile()){//文件,就create
- try {
- flag = addFile.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if(flag){
- System.out.println("添加成功!");
- }else{
- System.out.println("添加失败!");
- }
- Folder root = new Folder("Tree");
- Tool.createTree(file.listFiles(), root);//生成一颗树
- System.out.println(root.getString(" ", ""));//打印树
- }else if(args[0].equals("del")){
- /*
- * 4. 输入: java Folder del aa,在当前文件夹下面删除一个子目录(子目录名为:aa),
- * 同时显示当前文件夹下的最新目录和文件的文本形式树状显示
- */
- //file = new File(".//");
- File delFile = new File(file,args[1]);
- if(delFile.delete()){ //删除文件
- System.out.println("删除成功!");
- }else{
- System.out.println("删除失败!");
- }
- Folder root = new Folder("Tree");
- Tool.createTree(file.listFiles(), root);//生成一颗树
- System.out.println(root.getString(" ", ""));//打印树
- }else{
- System.out.println("输入命令无效!");
- }
- }
- }
- }
- class Tool{//工具类
- public static void createTree(File []files,Folder lastFolder){//递归
- for(int i=0;i<files.length;i++){
- int index=files[i].toString().lastIndexOf('//');
- Folder temFolder = new Folder(files[i].toString().substring(index+1));
- if(files[i].isDirectory()){ //是目录,加入然后继续递归
- lastFolder.addChild(temFolder);
- Tool.createTree(files[i].listFiles(),temFolder);
- }else{
- lastFolder.addChild(temFolder);//不是则只加入
- }
- }
- }
- }