File Tree rekursiv

Laren

Bekanntes Mitglied
Hi,

Wollte einen File Tree programmieren, hab aber ein Problem, dass ich immer einen "java.lang.StackOverflowError" bekomme, was wohl an der rekursiven Methode "TreeAktualMethode" liegt, aber warum und wie lös ich das Problem?

Grüße

Java:
 public static void SetRoot() {
        //Root setzen

        oben = new DefaultMutableTreeNode("Verzeichnisse");
        tree.setModel(new DefaultTreeModel(oben));
        TreeAktualMethode(datei);
    }

    /**
     * rekursive Anwendung
     * @param datei
     *
     */
    public static void TreeAktualMethode(File datei) {
        TreeAktual aktual = new TreeAktual(datei);
        aktual.start();
        File[] drives = datei.listRoots();


        {


            for (int i = 0; i < drives.length; i++) {
                if (drives[i].isDirectory()) {
                    TreeAktualMethode(drives[i]);
                }
            }
            aktual.stop();

        }
    }

hier ist noch der Thread "TreeAktual"

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dateiuebersicht;

import java.io.File;
import javax.swing.tree.DefaultMutableTreeNode;

/**
 *
 * @author René Hauck
 */
public class TreeAktual extends Thread {

    private static DefaultMutableTreeNode oben = DateiUebersichtView.oben;
    File datei;
    File[] drives;

    /**
     * Konstruktor
     */
    public TreeAktual(File datei) {
        this.datei = datei;
        drives = datei.listRoots();
    }

    @Override
    public void run() {
        for (int i = 0; i < drives.length; i++) {
            DefaultMutableTreeNode root = new DefaultMutableTreeNode(drives[i]);
            oben.add(root);
        }
    }
}
 
S

SlaterB

Gast
indem du dir anschaust, was du da überhaupt programmierst?!
weißt du wozu der ganze Code gut ist, weißt du was eine Datei ist, was die rekursive Methode dann ungefähr anstellen soll?
dann schaue doch nach ob sich das Programm auch nach diesen Vorgaben verhält,

logge/ untersuche den rekursiven Aufruf mit Debugger oder simplen System.out.println(),
schau nach was listRoots() jeweilse an (neuen oder doch nicht neuen?) Dateien liefert, ob diese korrekt der Reihe nach abgearbeitet werden usw.,

verwende am Anfang ein leeres Verzeichnis oder eines bei dem wenig Rekursion zu erwarten ist,
dass es doch wegen Fehler zu tausenden Aufrufen kommt weißt du schon, wenn du System.out.println() verwendest und zuviele Ausgaben auf einmal siehst, dann baue Thread.sleep(500); ein zur Verlansamung, mit try/catch drumherum
 

Laren

Bekanntes Mitglied
Hi,

Hab jetzt mal nochmal drüber geschaut und es wird besser^^
Er listet jetzt die Ordner auf, aber ich weis nicht wie ich jedesmal einen Unterzweig erzeugen kann(bei mir packt er alles in einen Zweig), und er listet jetzt immer alles 2 mal ab.

Java:
package dateiuebersicht;

import java.io.File;
import javax.swing.tree.DefaultMutableTreeNode;


public class TreeAktual extends Thread {

    private static DefaultMutableTreeNode oben = DateiUebersichtView.unten;
    File datei;
    File[] drives;

    /**
     * Konstruktor
     */
    public TreeAktual(File datei) {
        this.datei = datei;
        drives = datei.listFiles();
    }

    @Override
    public void run() {

        for (int i = 0; i < drives.length; i++) {
            if(drives[i].isDirectory())
            {
            DefaultMutableTreeNode root = new DefaultMutableTreeNode(drives[i]);
            oben.add(root);
            TreeAktual aktual = new TreeAktual(drives[i]);
            aktual.start();
            }
        }
    }
}

Java:
  public static void SetRoot() {
        //Root setzen

        oben = new DefaultMutableTreeNode("Verzeichnisse");
        tree.setModel(new DefaultTreeModel(oben));
        TreeAktualMethode(datei);
    }

    /**
     * rekursive Anwendung
     * @param datei
     *
     */
    public static void TreeAktualMethode(File datei) {
       
       
        File[] drives = datei.listRoots();
        for (int i = 0; i<drives.length;i++)
        {

        unten = new DefaultMutableTreeNode(drives[i]);
        oben.add(unten);
        TreeAktual aktual = new TreeAktual(drives[i]);
        aktual.start();
       
        }
        
    }
 
S

SlaterB

Gast
du brauchst doch nicht für jeden rekursiven Aufruf einen neuen Thread, wenn dann reicht dir einer,
darin meinetwegen neue Objekte statt üblichen rekursiven Aufruf, kannst notfalls sogar neue TreeAktual-Thread-Objekte nehmen,
aber bitte run() davon aufrufen, nicht start(), dann wird die run()-Methode wie eine normale Methode ausgeführt, kein separater Thread gestartet
(Achtung: allgemein ein schlechter Tipp, häufiger Fehler wenn ein Thread dann scheinbar wie ein Thread läuft aber doch nicht richtig nebenläufig)

----

die neuen Objekte solltest du im jeweiligen zugehörigen parent einfügen, bisher wirfst du alles in den einen statischen oben-Node
Java:
 DefaultMutableTreeNode root = new DefaultMutableTreeNode(drives[i]);
 oben.add(root);
 TreeAktual aktual = new TreeAktual(drives[i]);
hier musst du dafür sorgen, dass der rekursive Aufruf, das aktual-Objekt, seine Objekte in den gerade erzeugten root-Node einfügt, nicht auch in 'oben', übergib z.B. den neuen Node root als Parameter genau wie das File-Objekt drives,

übrigens wäre es besser, du würdes das File[] in TreeAktual nicht drives nennen, denn es sind ja keine Laufwerke, nicht mal unbedingt Directories/ Verzeichnisse, Dateien/ files wäre ein unverfänglicher Name,

wegen doppelt sehe ich persönlich noch nicht unbedingt einen Grund,
wenn sich das nicht nebenher findet oder von selber verschwindet, dann poste bitte bisschen mehr Code so dass man es möglichst ausprobieren kann
 
Zuletzt bearbeitet von einem Moderator:

Laren

Bekanntes Mitglied
hier musst du dafür sorgen, dass der rekursive Aufruf, das aktual-Objekt, seine Objekte in den gerade erzeugten root-Node einfügt, nicht auch in 'oben', übergib z.B. den neuen Node root als Parameter genau wie das File-Objekt drives,


ok, aber wenn jetzt mein übergebenes Parameter wieder mehrer Unterordner hat? Mit deiner Methode komme ich dann doch auch nur bis Unterordner 3 oder(bei meiner nur bis Unterordner 2 ;))?
 
S

SlaterB

Gast
eine Rekursion ist in ihren Ebenen nahezu unbegrenzt, nur die JVM kann in einer Tiefe von ein paar Tausend dann StackOverflowError werfen,
jeder Aufruf bekommt als Parameter das aktuelle Verzeichnis und eben den Node dazu, was praktisch dasselbe ist,
dies ist nicht von der Tiefe oder Position oder sonst etwas abhängig

edit: die von mir zitierte Code-Stelle existiert in deinem Code zweimal, wobei sie sich auch leicht unterscheiden (root vs unten),
ich meine eben die andere, die in der richtigen Rekursion
 
Zuletzt bearbeitet von einem Moderator:

Laren

Bekanntes Mitglied
Das Problem ist eigentlich, dass ich ja immer wieder einen neuen "DefaultMutableTreeNode" erstellen muss, ich aber nicht weis wieviel Unterordner vorhanden sind.
Ich hoffe ich kann mein Problem erläutern:oops:

Es funktioniert, wie ich es hier gemacht habe, aber das Problem ist wieder, dass ich nur bis zum 2 ten Unterordner gelange.(diesmal ohne Thread)

Java:
   public static void SetAnfang() {
        //Root setzen

        oben = new DefaultMutableTreeNode("Verzeichnisse");
        tree.setModel(new DefaultTreeModel(oben));
        SetRoot(datei);
    }

    public static void SetRoot(File datei) {
        File[] laufwerke = datei.listRoots();
        for (int i = 0; i < laufwerke.length; i++) {
            roots = new DefaultMutableTreeNode(laufwerke[i]);
            oben.add(roots);
            TreeAktualMethode(laufwerke[i]);
        }

    }

    public static void TreeAktualMethode(File datei) {
        File[] dateien = datei.listFiles();
        if (dateien != null) {
            for (int i = 0; i < dateien.length; i++) {
                if (dateien[i].isDirectory()) {
                    DefaultMutableTreeNode dateiRoots = new DefaultMutableTreeNode(dateien[i]);
                    roots.add(dateiRoots);
                }
            }
        }
}
 
S

SlaterB

Gast
schreibe Methoden bitte klein, das ist ja langsam unlesbar,

diesmal hast du den rekursiven Aufruf weggelassen, ohne den gehts aber nicht, das ist die Grundlage,
im neuesten Code muss nach Zeile 25 ein rekursiver Aufruf, Punkt, Ende, keine Diskussion

ansonsten sieht es wie zuvor aus: du fügst die Nodes in ein statisches Attribut oder in ein Klassenattribut,
das mag mit einem Root-Element funktionieren und jetzt mit einer Liste der obersten drives immer noch,
aber wie zuvor gesagt: wenn du einen kompletten schicken Baum beliebiger Ebenen haben willst, musst du den Parent-Node als Parameter an die rekursive Methode übergeben (und dort dann natürlich auch neue Nodes einfügen)

das ist der Schlüssel zum Sieg, auch wenn du es so abstrakt noch nicht siehst probiere einfach irgendetwas in der Richtung aus,
muss ja noch nicht gleich funktionieren, wenn du dann was postest mit begründeten Problemen, kann ich wieder korrigieren bzw. allgemeine Hinweise geben ;)
 

Laren

Bekanntes Mitglied
sorry, ich komme einfach nicht drauf, es ist so gut wie fertig, aber ich komme immer noch nur in 2 Unterordner. Ich weis nicht was ich übergeben soll. Hier meine Idee(ich habe einen Zaehler eingebaut, sonnst würde ja ein test ewig bauen;))

Java:
   public static void setAnfang() {
        //Root setzen

        oben = new DefaultMutableTreeNode("Verzeichnisse");
        tree.setModel(new DefaultTreeModel(oben));
        setRoot(datei);
    }

    /**
     * rekursive Anwendung
     * @param datei
     *
     */
    public static void setRoot(File uebergabe) {
        File[] laufwerke = uebergabe.listRoots();
        for (int i = 0; i < laufwerke.length; i++) {
            roots = new DefaultMutableTreeNode(laufwerke[i]);
            oben.add(DateiUebersichtView.roots);
            treeAktualMethode(laufwerke[i], roots);


        }
    }

    public static void treeAktualMethode(File uebergabe, DefaultMutableTreeNode wurzel) {

        zaehler++;
        System.out.print(zaehler);
        File[] dateien = uebergabe.listFiles();
        if (dateien != null) {
            for (int i = 0; i < dateien.length; i++) {
                if (dateien[i].isDirectory()) {

                    wurzel.add(new DefaultMutableTreeNode(dateien[i]));
                    if(zaehler <50)
                        treeAktualMethode(dateien[i], new DefaultMutableTreeNode(dateien[i]));
                  
                }

            }
        }
    }
 
S

SlaterB

Gast
der rekursive Aufruf hat jetzt einen richtigen Parameter wie von mir gedacht, du fügst auch in dieses wurzel ein, gut,
nur leider erzeugst du nun in Zeile 34 und 36 zwei Nodes zum aktuellen Eintrag, das kann doch unter keiner Vorstellung einen Sinn ergeben?

statt
Java:
                    wurzel.add(new DefaultMutableTreeNode(dateien[i]));
                    if(zaehler <50)
                        treeAktualMethode(dateien[i], new DefaultMutableTreeNode(dateien[i]));
selbstverständlich eher
Java:
   Node n = new DefaultMutableTreeNode(dateien[i]);
                    wurzel.add(n);
                    if(zaehler <50)
                        treeAktualMethode(dateien[i], n);
bzw. ähnlich

so wie du es in Zeile 17 bis 19 doch auch in etwa hast
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Vince42 NIO File Tree in XML umwandeln Java Basics - Anfänger-Themen 10
L File Tree Node ausgeben Java Basics - Anfänger-Themen 2
I Dateien in einem .war - File durchgehen? Java Basics - Anfänger-Themen 1
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
R File.pathSeparator und File.separator Java Basics - Anfänger-Themen 46
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
berserkerdq2 IOstreams, was unterscheidet file von z. B. BufferedWriter? Java Basics - Anfänger-Themen 11
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
A java jar-File Java Basics - Anfänger-Themen 1
E Executable jar file fehler Java Basics - Anfänger-Themen 9
I Upload File zu einem Webservice Java Basics - Anfänger-Themen 17
I ZIP File erstellen Java Basics - Anfänger-Themen 10
LeoDerKek Textdatei in JAR-File Java Basics - Anfänger-Themen 4
Tom/S File Java Basics - Anfänger-Themen 10
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
H Java file nicht gefunden Java Basics - Anfänger-Themen 5
C File speichern Java Basics - Anfänger-Themen 5
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
C Pfad zu Properties-File bei ResourceBundle Java Basics - Anfänger-Themen 7
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
K File (png) in Image laden Java Basics - Anfänger-Themen 3
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
S Input/Output Reader/Writer finden file nicht Java Basics - Anfänger-Themen 3
T Buffered Stream leert Txt File Java Basics - Anfänger-Themen 3
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
K File wird in der .Jar nicht gefunden Java Basics - Anfänger-Themen 3
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
Trèfle EXCEL-File Laufwerkunabhängig einbinden. Java Basics - Anfänger-Themen 1
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
topi relativer Pfad in einem Runnable JAR file Java Basics - Anfänger-Themen 12
A jar File kleiner bekommen Java Basics - Anfänger-Themen 3
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
krgewb Runnable JAR File Export Java Basics - Anfänger-Themen 11
S Maxium aus einer File finden Java Basics - Anfänger-Themen 12
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
D Input/Output File exists canRead canWrite Java Basics - Anfänger-Themen 11
B cal4j - Error at line 1:Unexpected end of file Java Basics - Anfänger-Themen 0
P jar file lässt sich nicht ausführen Java Basics - Anfänger-Themen 4
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
F File von Windowsfreigabe laden Java Basics - Anfänger-Themen 1
S java.nio.file.FileSystemException bei Dateizugriff vermeiden Java Basics - Anfänger-Themen 7
J Zweidimensionales Array in CSV File exportieren Java Basics - Anfänger-Themen 3
E War-File Problem mit Eclipse Java Basics - Anfänger-Themen 3
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
M Input/Output Word File Kopieren Java Basics - Anfänger-Themen 12
K Runable Jar File erstellen Java Basics - Anfänger-Themen 17
T Java Executable jar file funktioniert nicht Java Basics - Anfänger-Themen 4
sourcecorn Werte aus einem File lesen Java Basics - Anfänger-Themen 6
Kopak'rraf Korruptes zip File. Java Basics - Anfänger-Themen 0
T File für Einstellungen wird nicht geladen Java Basics - Anfänger-Themen 1
S Sounddatei in Jar File integrieren Java Basics - Anfänger-Themen 2
S Index File bauen Java Basics - Anfänger-Themen 5
T Anzeige, wie lange es noch dauert bis ein File gesendet ist. Java Basics - Anfänger-Themen 2
T filereader , file aus programm einlesen Java Basics - Anfänger-Themen 12
Ghostman1711 Itext PDF print File gelockt by Java Java Basics - Anfänger-Themen 15
N Email mit Anhang - File not Found Java Basics - Anfänger-Themen 1
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
S File mit canRead() testen Java Basics - Anfänger-Themen 4
A file.delete funktioniert nicht Java Basics - Anfänger-Themen 15
K Classpath Lesen von Property-File Java Basics - Anfänger-Themen 1
S jar file Java Basics - Anfänger-Themen 19
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
B Dateityp von File bekommen Java Basics - Anfänger-Themen 2
I Automatisch Verzeichnis erstellen bei File erstellen Java Basics - Anfänger-Themen 5
E Große Datenmengen effizient in CSV File speichern Java Basics - Anfänger-Themen 4
I String zu File umwandeln Java Basics - Anfänger-Themen 2
N File virtuell ByteStream Java Basics - Anfänger-Themen 11
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
Anfänger2011 file.isDirectory() liefert falschen Wert!? Java Basics - Anfänger-Themen 1
ms_cikar Jar file mit resource erzuegen Java Basics - Anfänger-Themen 28
E lesen csv file column by column Java Basics - Anfänger-Themen 10
U Anhand von Ant ein War-File erstellen Java Basics - Anfänger-Themen 0
B Quellcode einelsen "line by line" (und abspeichern in file (txt) Java Basics - Anfänger-Themen 7
O Zip-File Inhalt einlesen Java Basics - Anfänger-Themen 3
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
P Jar File Java Basics - Anfänger-Themen 3
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
S CSV File - "Vergleichen und Sortieren" Java Basics - Anfänger-Themen 3
T Wieso kann ich das jar file nicht starten? Java Basics - Anfänger-Themen 5
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
A Wieso übergibt der nicht die bearbeitete txt file Java Basics - Anfänger-Themen 8
Ruvok Executable Jar File startet nicht Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben