verzeichnisinhalt auflisten

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich hoffe jemand von euch kann mir helfen. Ich muss ale Dateien mehrer Verzeichnisse Durchlaufen.

Code:
public static void schemaPruefen() throws Exception {		

	String xmlpfad = pfad+schemaTyp;
	File xmlverz = new File(xmlpfad);
	String[] xmls = xmlverz.list();
	int i = 0;
	while(xmls != null) {
		File xml = new File(xmlpfad + "\\" + xmls[i]);
		if(xml.isFile() && xmls[i].toString().endsWith(".xml")) {
			Validierung(xmlpfad + "\\" + xmls[i].toString(), tf.getText().toString());
		}
		i++;
	}
		
}

Funktionieren tut die ganze Sache, aber das Problem ist, diese Verzeichnisse haben jeweils ca. 500000 Dateien. Mein Programm braucht einfach zu lange, um
Code:
String[] xmls = xmlverz.list();
auszuwerten.


Kennt ihr vielleicht eine schnellere Alternative?
 

madboy

Top Contributor
Bist du dir sicher, dass list() schuld ist?

Das hier ist nämlich ne Endlosschleife wenn xmlverz existiert:
Code:
	String[] xmls = xmlverz.list();
	int i = 0;
	while(xmls != null) {
Ok, stimmt nicht ganz, das wird dir wohl mit einer ArrayIndexOutOfBoundsException um die Ohren fliegen, aber das ist nicht sonderlich sauber :wink:
 

diggaa1984

Top Contributor
ohne mich grad mal festlegen zu wollen, aber ich würde mal behaupten mit:
Code:
File[] allFiles = xmlverz.listFiles();
würdest schonmal das "new" in der Schleife weglassen können. ???:L
Korrigiert mich falls das falsch ist, bzw wenn das nicht son grossen unterschied macht, aber der Umweg übers String-array würde auf jeden fall wegfallen.
 
S

SlaterB

Gast
vielleicht werden die 500.000 File-Objekte dann innerhalb von listFiles(); erstellt
und eine Schleife für das File-Array statt String-Array ist ja Jacke wie Hose,

ein Blick in den Quellcode gibt mir da grad Recht, in dem Fall also nix zu machen
Code:
    public File[] listFiles() {
	String[] ss = list();
	if (ss == null) return null;
	int n = ss.length;
	File[] fs = new File[n];
	for (int i = 0; i < n; i++) {
	    fs[i] = new File(ss[i], this);
	}
	return fs;
    }

edit: durch den doppelten Schleifendurchlauf sogar noch langsamer,
bei 500.000 sind for-i-Durchläufe doch recht langsam wenn ich mich recht erinnere
 

diggaa1984

Top Contributor
das sie irgendwo erstellt werden mussten war mir schon klar :D ... hätt sein können das es Sun ein wenig effektiver umgesetzt hat, wollte nu nich extra den code rauswühlen, aber dem scheint ja nicht so :roll:
 
M

maki

Gast
Mit einem FileFilter könnte man dafür sorgen, das nciht alle Dateien ins Array kommen (und vorher in die ArrayList, inkl. dynamischer Vergrößerung), sondern nur xml files, aber ob das merklich schneller ist?
Zumindest wird man die if Abfrage los...
 

Atze

Top Contributor
vielleicht könntest du dir das file-objekt in der schleife sparen!?
denn nur um isFile() abzufragen und es dann wegzuwerfen ist ja arg teuer

wenn der pfad mit ".xml" endet, wird es kein ordner sein und existieren wird das file auch, sonst wäre es ja nicht in der liste.

Würde dann nicht:

if(xmls.toString().endsWith(".xml")) {

reichen? Oder vertu ich mich? :/
 

diggaa1984

Top Contributor
theoretisch könnte auch ein ordner auf .xml enden ... das kannst so einfach nich pauschalisieren, könnte man natürlich vorher festlegen das dem nich so ist, aber möglich ist es.
 
G

Guest

Gast
Hallo,
ertsmal danke für die vielen Antworten. Also, ich hab jetzt festgestellt, dass es wirklich an

Code:
String[] xmls = new File(xmlpfad).list();

liegen muss....es dauert einfach zu lange diesen Verzeichnis Inhalt anzeigen zu lassen.
 

madboy

Top Contributor
Bitte definiere "zu lange". Bei mir dauert es ca. 29 Sekunden beim ersten Durchlauf und bei folgenden Läufen noch ca. 2 Sekunden (durch Caching des Betriebssystems vermutlich).

Getestet habe ich mit 500000 leeren Dateien in einem Verzeichnis unter Linux (Kubuntu 8.04 (Hardy) mit ext3-Dateisystem) und einer vermutlich relativ langsamen Notebookfestplatte :wink:

Code:
long start = System.currentTimeMillis();
       File toList = new File("/home/tmp/do_not_open"); //Es dauert wirklich eeeewig, das mit konqueror zu öffnen ;-)
       String[] files = toList.list();
       System.out.println("Dauer: " + 
               (System.currentTimeMillis() - start));

Mir würden spontan 2 Dinge einfallen, um die Zeit fürs Auflisten zu minimieren:
- ein anderes Dateisystem (ich weiß allerdings nicht, welches hier geeignet wäre)
- die Dateien in eine Datenbank schreiben (oder vielmehr nur den Inhalt)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben