从文本文件中读取文件夹结构并创建结构 - 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;
}
}
}
我有一个文本文件,其内容如下列出一个文件夹结构:
/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;
}
}
}