2016-07-01 16 views
0

Ich habe eine Anforderung, wo ich ein Dateiverzeichnis und seine Unterverzeichnisse und Dateien in ihnen analysieren müssen. Des Weiteren habe ich auf die Dateigrößen innerhalb dieser Verzeichnisse Statistiken zu tun und die Ergebnisse auf zwei Bildschirmen sichtbar machen:Datenstruktur zum Mock eines Dateiverzeichnisses

1) Ordnerbaum mit Verzeichnisse, Unterverzeichnisse und Dateien (Größe> 50 mb)

2) Ordnerbaum mit Verzeichnissen, Unterverzeichnissen und Dateien (Größe < 50 mb)

die Ergebnisse Druck direkt von der Dateistruktur Parsen ist einfach, aber ich kann von jeder Datenstruktur nicht denken, wo ich mich erinnern kann die Verzeichnis- und Unterverzeichnisse und Dateien darin.

Dies ist etwas, was ich schon für das Parsen das Verzeichnis implementiert haben:

public void listFilesAndFilesSubDirectories(String directoryName) { 
    File directory = new File(directoryName); 
    //get all the files from a directory 
    File[] fList = directory.listFiles(); 
    for (File file : fList) { 
     if (file.isFile()) { 
      System.out.println(file.getAbsolutePath() + " " + file.length()/1024); 
      countWords(file.getAbsolutePath()); 
      findRepeatedWords(file.getAbsolutePath()); 
     } else if (file.isDirectory()) { 
      listFilesAndFilesSubDirectories(file.getAbsolutePath()); 
     } 
    } 
} 

Der Platz, den ich geschrieben habe Sysout statment, ich möchte eine Datenstruktur verwenden, wo ich Verzeichnis und dessen Unterverzeichnisse und Dateien speichern und Dateien in diesen Unterverzeichnissen.
Danke in Erwartung.

+3

Sie meinen etwas wie ..... [Baum] (https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html)? – Tom

+1

Haben Sie erwogen, JDK-Abstraktionen wie 'FileSystem',' File', 'Path', etc.direkt zu verwenden? –

+0

@tom Ja, genau. Aber es würden zwei Ansichten basierend auf einigen Kriterien gefiltert werden. –

Antwort

0

Jede baumähnliche Datenstruktur ist für Ihr Problem geeignet. Das kann eine , eine TreeMap oder TreeNode s wie die Swing TreeNodes sein.

Beginnend mit Java 7 können Sie die FileVisitor verwenden, um Ihr internes Struktur-/Ansichtsmodell zu erstellen und zu filtern.

Im folgenden einfachen Beispiel wird ein FileVisitor verwendet, um ein Ansichtsmodell ein Ansichtsmodell eines Verzeichnisses zu erstellen. Der FilePathNode ist ein Adapter für das Objekt java.nio.file.Path. Ich habe einige Kommentare eingefügt, in denen Sie die Filterlogik hinzufügen können. Das Beispiel zeigt nur einen Bildschirm für den zweiten Bildschirm/die zweite Ansicht, ein zweites JTree Element mit einem zweiten Ansichtsmodell.

package filetreeexamle; 

import java.awt.BorderLayout; 
import java.io.IOException; 
import java.nio.file.FileVisitResult; 
import java.nio.file.FileVisitor; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.BasicFileAttributes; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTree; 
import javax.swing.WindowConstants; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.MutableTreeNode; 


public class FileTreeSwingUIExample { 


    @SuppressWarnings("serial") 
    private static class FilePathNode extends DefaultMutableTreeNode { 

     // store additional stuff like used diskspace (for directories and files) 


     public FilePathNode(Path path) { 
      super(path); 
     } 

     @Override 
     public void add(MutableTreeNode newChild) { 
      if (((Path)getUserObject()).toFile().isFile()) 
       throw new IllegalArgumentException("Can't add a child node to a file."); 
      super.add(newChild); 
     } 

     @Override 
     public boolean isLeaf() { 
      return ((Path)getUserObject()).toFile().isFile(); 
     } 

    } 

    private static class TreeViewControllerDelegate { 
     private JTree treeView; 

     private static class FileTreeBuilder implements FileVisitor<Path> { 

      // node where the builder starts 
      // contains the whole subtree after processing the whole tree 
      FilePathNode rootNode; 

      // temporary reference to the directory currently processed. 
      private FilePathNode currentDir;     

      @Override 
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { 

       currentDir = new FilePathNode(dir); 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
       FilePathNode fileNode = new FilePathNode(file); 
       // here you can add filter conditions for files 
       // also you may update the consumed disk space of the parent directory 
       currentDir.add(fileNode); 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { 
       if (exc != null) throw exc; 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { 
       if (exc != null) throw exc; 

       // here you can filter directories like directories 
       // which use more than n MB of diskspce. 

       if (rootNode == null) { 
        rootNode = currentDir; 
       } else { 
        rootNode.add(currentDir); 
       } 
       return FileVisitResult.CONTINUE; 
      } 


     } 

     public TreeViewControllerDelegate(JTree treeView) { 
      this.treeView = treeView; 
     } 

     public void load(Path path) {   

      FileTreeBuilder builder = new FileTreeBuilder(); 
      try { 
       Files.walkFileTree(path, builder); 
       treeView.setModel(new DefaultTreeModel(builder.rootNode)); 
       treeView.repaint(); 
      } catch (IOException ioe) { 
       JOptionPane.showMessageDialog(null, 
         "Failed to load file strucutre", 
         "Error", 
         JOptionPane.ERROR_MESSAGE); 
      } 
     } 

    } 

    public static void main(String ... args) { 


     JFrame mainWindow = new JFrame("Sample File Tree View"); 
     JTree fileTree = new JTree(); 

     TreeViewControllerDelegate controller = new TreeViewControllerDelegate(fileTree); 
     controller.load(Paths.get(".")); 

     mainWindow.getContentPane().setLayout(new BorderLayout()); 
     mainWindow.add(fileTree, BorderLayout.CENTER); 
     mainWindow.setSize(200, 300); 
     mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     mainWindow.setVisible(true); 

    } 
} 
Verwandte Themen