Die Java-Oberfläche zum Lesen von Ordnerinhalten im Dateisystem ist nicht sehr leistungsfähig (wie Sie festgestellt haben). JDK 7 behebt dieses Problem mit einer völlig neuen Schnittstelle für diese Art von Dingen, die die Leistung auf nativer Ebene für diese Art von Vorgängen verbessern soll.
Das Hauptproblem besteht darin, dass Java für jede einzelne Datei einen nativen Systemaufruf ausführt. Auf einer Schnittstelle mit geringer Latenz ist dies keine große Sache - aber in einem Netzwerk mit selbst mäßiger Latenz summiert sich das wirklich. Wenn Sie Ihren Algorithmus oben profilieren, werden Sie feststellen, dass der Großteil der Zeit im lästigen Aufruf von isDirectory () verbracht wird. Dies liegt daran, dass Sie für jeden einzelnen Aufruf von isDirectory () einen Roundtrip durchführen. Die meisten modernen Betriebssysteme können diese Art von Informationen bereitstellen, wenn die Liste der Dateien / Ordner ursprünglich angefordert wurde (anstatt jeden einzelnen Dateipfad nach seinen Eigenschaften abzufragen).
Wenn Sie nicht auf JDK7 warten können, besteht eine Strategie zur Behebung dieser Latenz darin, Multithreading zu verwenden und einen ExecutorService mit einer maximalen Anzahl von Threads zu verwenden, um Ihre Rekursion durchzuführen. Es ist nicht großartig (Sie müssen sich mit dem Sperren Ihrer Ausgabedatenstrukturen befassen), aber es wird verdammt viel schneller sein als dieses einzelne Threaded.
In all Ihren Diskussionen über diese Art von Dingen empfehle ich Ihnen dringend, sich mit dem Besten zu vergleichen, das Sie mit nativem Code (oder sogar einem Befehlszeilenskript, das ungefähr dasselbe tut) tun können. Zu sagen, dass das Durchqueren einer Netzwerkstruktur eine Stunde dauert, bedeutet nicht wirklich viel. Wenn Sie uns sagen, dass Sie es in 7 Sekunden nativ machen können, aber in Java dauert es eine Stunde, wird die Aufmerksamkeit der Leute auf sich gezogen.