Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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_Readfile - Fatal编程技术网

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

从文本文件中读取文件夹结构并创建结构-java,java,readfile,Java,Readfile,我有一个包含如下内容的文本文件,列出了一个文件夹结构: /root1 /folder1 /file1 /folder2 /file1 /folder3 /file1 /root2 /folder1 /file1 /folder2 /file1 /folder3 /file1 有没有更好的方法来实现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;
    }
  }
}
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
导入java.util.Stack;
公共类指令读取器{
专用静态最终整数缩进=4;
公共静态void main(字符串[]args)引发异常{
目录结果=new dirstucturerereader().read(新文件(“testfile.txt”);
系统输出打印项次(结果);
}
公用目录读取(文件)引发IOException{
扫描仪=新扫描仪(文件);
Stack directoryStack=新堆栈();
目录根=新目录(“/”;//所有内容的根目录
添加(根目录);
while(scanner.hasNextLine()){
processLine(scanner.nextLine(),directoryStack);
}
返回根;
}
私有void进程行(字符串行,堆栈目录堆栈){
int nLeadingSpaces=getNumberOfLeadingSpaces(行);
if(nleadingspace==-1)返回;
int-depth=n读取空间/缩进;
while(directoryStack.size()>深度+1){
directoryStack.pop();//当我们深入并跳上一个或多个级别时,从堆栈中丢弃元素
}
String dirName=line.substring(nReadingSpaces+1);
目录目录=新目录(目录名);
directoryStack.peek().getChildren().add(directory);//将目录添加到正确父目录的子目录
push(目录);
}
私有int GetNumberOfLeadingSpace(字符串行){
对于(int i=0;i
所以文件内容是目录结构,您想在代码中存储该结构,还是想从上述目录结构中读取文件?谢谢David。那确实帮了我很大的忙!我也计划使用Scanner我同意你关于文件夹结构的建议。所以继续说:)