从文本文件中读取文件夹结构并创建结构-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我同意你关于文件夹结构的建议。所以继续说:)