从文本文件中读取文件夹结构并创建结构 - java

read folder structure from a text file and create the structure - java

我有一个文本文件,其内容如下列出一个文件夹结构:

/root1

    /folder1
        /file1
    /folder2
        /file1
    /folder3
        /file1
/root2

    /folder1
        /file1
    /folder2
        /file1
    /folder3
        /file1

有没有更好的方法来实现 java 解决此类问题的程序?或者我只需要通读文件中的每一行?

我是 Java 的新手,不确定有哪些更好的库可以读取 Java 中的文件。

谢谢。

如果你想创建目录和文件,最后你应该添加绝对路径作为输入。如果你想通过一个文件来完成,就像你上面写的那样,我建议你将一个文件的 abolutePath 存储在一行中。例如:
root1/folder1/file1
root1/folder2/file2
root2/folder2/file3
这种情况下阅读效率更高,速度更快我认为,文件中程序中的路径。然后你可以使用 mkdirs() 和 createNewFile()。
另一方面,您还应该考虑操作系统的文件分隔符。如果你想以编程方式将新路径添加到文件中,你应该使用 File.separator 常量。 (或者,如果您手动写入数据,则应使用相同的分隔符。)

我认为这是一项非常具体的任务,因此我不知道是否有任何图书馆可以开箱即用。主要思想是您要记录已处理行的当前祖先。您可以使用堆栈来完成。我想知道我的算法是否真的有效,所以我对其进行了编码并且它确实有效:)希望它有所帮助。

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class DirStuctureReader {

  private static final int INDENTATION = 4;

  public static void main(String[] args) throws Exception {
    Directory result = new DirStuctureReader().read(new File("testfile.txt"));
    System.out.println(result);
  }

  public Directory read(File file) throws IOException {
    Scanner scanner = new Scanner(file);
    Stack<Directory> directoryStack = new Stack<>();
    Directory root = new Directory("/"); // a root directory for everything
    directoryStack.add(root);
    while (scanner.hasNextLine()) {
      processLine(scanner.nextLine(), directoryStack);
    }

    return root;
  }

  private void processLine(String line, Stack<Directory> directoryStack) {
    int nLeadingSpaces = getNumberOfLeadingSpaces(line);
    if (nLeadingSpaces == -1) return;
    int depth = nLeadingSpaces / INDENTATION;
    while (directoryStack.size() > depth + 1) {
      directoryStack.pop(); // discard elements from the stack when we are deep and jump up one or more levels
    }
    String dirName = line.substring(nLeadingSpaces + 1);
    Directory directory = new Directory(dirName);
    directoryStack.peek().getChildren().add(directory); // add the directory to the children of the proper parent dir
    directoryStack.push(directory);
  }

  private int getNumberOfLeadingSpaces(String line) {
    for (int i = 0; i < line.length(); i++) {
      if (line.charAt(i) != ' ') return i;
    }

    return -1;
  }

  public static class Directory {
    private List<Directory> children = new ArrayList<>();

    private final String name;

    public Directory(String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

    public List<Directory> getChildren() {
      return children;
    }
  }
}