我正在编写文件系统层次结构的N元树表示,其中每个节点包含有关它所代表的文件/文件夹的一些信息。
public class TreeNode {
private FileSystemEntry data;
private boolean directory;
private TreeNode parent;
private ArrayList<TreeNode> children;
private int numChildren;
private int key;
树存储为自己的对象,因为我要比较几棵树
public class DirectoryTree {
private TreeNode Root;
private int numNodes;
private TreeNode Focus;
private LocalDateTime date;
private long totalSizeOnDisk;
这里是FileSystemEntry类供参考
public class FileSystemEntry {
private Path path;
private String name;
private long sizeOnDisk;
private FileTime created;
private FileTime lastModified;
我需要将每个节点写入文件,以便以后可以重新加载,以便在两个不同的时间比较树。我可以轻松地将FileSystemEntry中的变量和DirectoryTree中的日期写入CSV,以便重新创建每个FSE及其各自的节点,但我无法知道如何知道哪个节点是给定节点父节点,以便重建树。
乍一看,广泛的首次遍历和来自TreeNode的numChildren甚至密钥似乎都是足够的信息,但我还没有能够实现解决方案。我是在考虑正确的方向还是我使问题复杂化
答案 0 :(得分:1)
使用ObjectOutputStream
将DirectoryTree
个对象写入文件。因此,您必须为要编写的所有类实现Serializable
接口。
这将保留您的结构/层次结构,您不必乱用节点之间的关系。
示例:的
public class TreeNode imlpements Serializable {
private FileSystemEntry data;
private boolean directory;
private TreeNode parent;
private ArrayList<TreeNode> children;
private int numChildren;
private int key;
}
public class DirectoryTree imlpements Serializable {
private TreeNode Root;
private int numNodes;
private TreeNode Focus;
private LocalDateTime date;
private long totalSizeOnDisk;
}
public class FileSystemEntry imlpements Serializable {
private Path path;
private String name;
private long sizeOnDisk;
private FileTime created;
private FileTime lastModified;
}
将对象写入文件:
public class IOTest {
public static void main(String[] args) {
File file;
// create your Tree
DirectoryTree dirTree;
file = new File("filename");
dirTree = createTree();
// write object into file
writeTree( dirTree, file );
// read object from file
DirectoryTree newDirTree;
file = new File("filename");
newDirTree = readTree( file );
}
public static DirectoryTree createTree() {
// create here your tree
}
public static void writeTree( DirectoryTree tree, File file ) {
FileOutputStream fos;
ObjectOutputStream oos;
try {
fos = new FileOutputStream( file );
oos = new ObjectOutputStream( fos );
oos.writeObject( tree );
oos.flush();
oos.close();
} catch( IOException ioe ) {
ioe.printStackTrace();
}
}
public static DirectoryTree readTree( File file ) {
DirectoryTree loadedTree = null;
FileInputStream fos;
ObjectInputStream oos;
try {
fos = new FileInputStream( file );
oos = new ObjectInputStream( fos );
// you have to cast your object into a DirectoryTree,
// because read() will return an object of type `Object`
loadedTree = (DirectoryTree) oos.read();
oos.close();
} catch( IOException ioe ) {
ioe.printStackTrace();
}
return loadedTree;
}
}