从CSV文件实例化N-ary树

时间:2017-03-25 21:59:35

标签: java csv tree

我正在编写文件系统层次结构的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甚至密钥似乎都是足够的信息,但我还没有能够实现解决方案。我是在考虑正确的方向还是我使问题复杂化

1 个答案:

答案 0 :(得分:1)

使用ObjectOutputStreamDirectoryTree个对象写入文件。因此,您必须为要编写的所有类实现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;

    }

}