我的文本文件包含以下内容列出文件夹结构:
`clock': wrong number of arguments (1 for 0) (ArgumentError)
有没有更好的方法来实现java程序来解决这类问题?或者我只需要阅读文件中的每一行?
我是Java的新手,不知道在Java中读取文件有哪些更好的库。
谢谢。
答案 0 :(得分:0)
如果要创建目录和文件,最后应该将absolutePaths添加为输入。如果您想通过文件执行此操作,如上所述,我建议您将一个文件的abolutePath存储在一行中。例如:
root1 / folder1 / file1
root1 / folder2 / file2
root2 / folder2 / file3
在这种情况下,它更有效,更快速地读取程序中的路径我认为,从文件中。然后你可以使用mkdirs()和createNewFile()。
另一方面,您还应该考虑操作系统的文件分隔符。如果要以编程方式将新路径添加到文件中,则应使用File.separator常量。 (或者,如果手动编写数据,则应使用相同的分隔符。)
答案 1 :(得分:0)
我认为这是一项非常具体的任务,因此我不知道任何能够为您提供开箱即用的库。主要思想是你想要记下处理过的生产线的当前祖先。你可以用堆栈来做。我想知道我的算法是否真的有效,所以我编写了它并且确实有效:)希望它有所帮助。
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;
}
}
}