Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打印类似目录树的命令_Java_Algorithm_Printing_Tree_Directory - Fatal编程技术网

Java 打印类似目录树的命令

Java 打印类似目录树的命令,java,algorithm,printing,tree,directory,Java,Algorithm,Printing,Tree,Directory,我必须打印目录树。 我有以下代码: public static void main(String[] args) throws Exception { File root = new File("C:\\Users\\User\\Desktop\\example"); if (!root.isDirectory()) { throw new IllegalArgumentException("Invalid directory: " + root.getName());

我必须打印目录树。 我有以下代码:

public static void main(String[] args) throws Exception
{

  File root = new File("C:\\Users\\User\\Desktop\\example");

  if (!root.isDirectory())
  {
    throw new IllegalArgumentException("Invalid directory: " + root.getName());
  }

  int level = 0;
  System.out.println(renderFolder(root, level, new StringBuilder(), false));
}

private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast)
{
  indent(sb, level, isLast).append(folder.getName()).append("\n");

  File[] objects = folder.listFiles();

  for (int i = 0; i < objects.length; i++)
  {
    boolean last = ((i + 1) == objects.length);

    if (objects[i].isDirectory())
    {
      renderFolder(objects[i], level + 1, sb, last);
    }
  }
  return sb;
}


private static StringBuilder indent(StringBuilder sb, int level, boolean isLast)
{

  for (int i = 1; i < level; i++)
  {
     sb.append("\u2502   ");
  }

  if (level > 0)
  {
    sb.append(isLast
      ? "\u2514\u2500\u2500"
      : "\u251c\u2500\u2500");
  }

  return sb;
}
我没能去掉那些无用的深线条。如何做到这一点?
另外,我的答案是:“如何保持线路连接(就像cmd的tree命令一样)?”

import java.io.File;
公共类FileAssert{
/**
*漂亮地打印目录树及其文件名。
* 
*@param文件夹
*必须是一个文件夹。
*@返回
*/
公共静态字符串printDirectoryTree(文件夹){
如果(!folder.isDirectory()){
抛出新的IllegalArgumentException(“文件夹不是目录”);
}
int缩进=0;
StringBuilder sb=新的StringBuilder();
printDirectoryTree(文件夹、缩进、sb);
使某人返回字符串();
}
私有静态void printDirectoryTree(文件夹,int-indent,
(某人){
如果(!folder.isDirectory()){
抛出新的IllegalArgumentException(“文件夹不是目录”);
}
sb.append(getIndentString(indent));
某人加上“+——”;
sb.append(folder.getName());
某人加上(“/”);
某人附加(“\n”);
对于(文件:folder.listFiles()){
if(file.isDirectory()){
printDirectoryTree(文件,缩进+1,sb);
}否则{
打印文件(文件,缩进+1,sb);
}
}
}
私有静态void打印文件(文件文件、int缩进、StringBuilder sb){
sb.append(getIndentString(indent));
某人加上“+——”;
sb.append(file.getName());
某人附加(“\n”);
}
私有静态字符串getIndentString(int-indent){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
对于所有父级,您必须保留项目是否是文件夹中最后一个项目的信息。也就是说,您应该使
isLast
成为一个数组


例如,当您尝试打印项目
b111
时,该列表应为
[true,true,false,true]
。第一个条目告诉您是否打印垂直线,最后一个条目告诉您是打印角点还是T形接头。

试试这个,我在您的方法中添加了另一个名为hierarchyTree的参数,以指示在某个级别,我们应该打印|还是空白

它被用作一个堆栈,以便根据递归级别轻松维护文件夹级别

private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
    indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");

    File[] objects = folder.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isDirectory();
        }
    });

    for (int i = 0; i < objects.length; i++) {
        boolean last = ((i + 1) == objects.length);

        // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
        hierarchyTree.add(i != objects.length - 1);
        renderFolder(objects[i], level + 1, sb, last, hierarchyTree);

        // pop the last value as we return from a lower level to a higher level
        hierarchyTree.remove(hierarchyTree.size() - 1);
    }
    return sb;
}


private static StringBuilder indent(StringBuilder sb, int level, boolean isLast, List<Boolean> hierarchyTree) {
    String indentContent = "\u2502   ";
    for (int i = 0; i < hierarchyTree.size() - 1; ++i) {
        // determines if we need to print | at this level to show the tree structure
        // i.e. if this folder has a sibling foler that is going to be printed later
        if (hierarchyTree.get(i)) {
            sb.append(indentContent);
        } else {
            sb.append("    "); // otherwise print empty space
        }
    }

    if (level > 0) {
        sb.append(isLast
                ? "\u2514\u2500\u2500"
                : "\u251c\u2500\u2500");
    }

    return sb;
}

Hi Rick,你有好的答案吗?
level
参数是多余的,请使用
hierarchyTree.size()
import java.io.File;
public class FileAssert {

/**
 * Pretty print the directory tree and its file names.
 * 
 * @param folder
 *            must be a folder.
 * @return
 */
public static String printDirectoryTree(File folder) {
    if (!folder.isDirectory()) {
        throw new IllegalArgumentException("folder is not a Directory");
    }
    int indent = 0;
    StringBuilder sb = new StringBuilder();
    printDirectoryTree(folder, indent, sb);
    return sb.toString();
}

private static void printDirectoryTree(File folder, int indent,
        StringBuilder sb) {
    if (!folder.isDirectory()) {
        throw new IllegalArgumentException("folder is not a Directory");
    }
    sb.append(getIndentString(indent));
    sb.append("+--");
    sb.append(folder.getName());
    sb.append("/");
    sb.append("\n");
    for (File file : folder.listFiles()) {
        if (file.isDirectory()) {
            printDirectoryTree(file, indent + 1, sb);
        } else {
            printFile(file, indent + 1, sb);
        }
    }

}

private static void printFile(File file, int indent, StringBuilder sb) {
    sb.append(getIndentString(indent));
    sb.append("+--");
    sb.append(file.getName());
    sb.append("\n");
}

private static String getIndentString(int indent) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < indent; i++) {
        sb.append("|  ");
    }
    return sb.toString();
}
}
private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
    indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");

    File[] objects = folder.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isDirectory();
        }
    });

    for (int i = 0; i < objects.length; i++) {
        boolean last = ((i + 1) == objects.length);

        // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
        hierarchyTree.add(i != objects.length - 1);
        renderFolder(objects[i], level + 1, sb, last, hierarchyTree);

        // pop the last value as we return from a lower level to a higher level
        hierarchyTree.remove(hierarchyTree.size() - 1);
    }
    return sb;
}


private static StringBuilder indent(StringBuilder sb, int level, boolean isLast, List<Boolean> hierarchyTree) {
    String indentContent = "\u2502   ";
    for (int i = 0; i < hierarchyTree.size() - 1; ++i) {
        // determines if we need to print | at this level to show the tree structure
        // i.e. if this folder has a sibling foler that is going to be printed later
        if (hierarchyTree.get(i)) {
            sb.append(indentContent);
        } else {
            sb.append("    "); // otherwise print empty space
        }
    }

    if (level > 0) {
        sb.append(isLast
                ? "\u2514\u2500\u2500"
                : "\u251c\u2500\u2500");
    }

    return sb;
}
example
├──a
├──b
│   └──b1
│       ├──b11
│       │   └──b111
│       └──b12
│           ├──b121
│           └──b122
│               └──b1221
└──c