# Platzverbrauch, File oder String



## Schlaftablette (4. Jan 2013)

Hallo

Ich programmiere gerade ne art Datei-Suchmaschine für meinen PC sowie die im Netzwerk verbundenen Laufwerke (ich weiß, gibt schon viele, jedoch will ich dies für mich speziell anpssen)

Da kam mir die Frage, was weniger platz braucht:
das File-Object, das wird ja einen haufen Platz brauchen, wenn ich für jede gelesene Datei einen Eintrag brauche, oder einfach den kompletten Pfad in ein String-Object ? Daraus kann ich ja weiterarbeiten.
Beim String bräuchte ich dann noch die Größe und das letzte Speicherdatum (zumindest für den Anfang).

Wie viel Platz braucht ein File-Object ?? (vermutlich abhängig von Pfadlänge usw.)

Aufbauen würde ich dies als linkedlist, da ich beim suchen sowieso immer alle durchsuchen muss.

Habt ihr da rigendwelche Tipps oder erfahrungen für mich ?

Danke, S.


----------



## Timothy Truckle (4. Jan 2013)

Schlaftablette hat gesagt.:


> Da kam mir die Frage, was weniger platz braucht:


Mit solchen Fragen solltest Du Dich erst beschäftigen, wenn Du tatsächlich Probleme mit dem Speicher hast, und dann auch erst, wenn Du mittels Profiling festgestellt hast, dass [JAPI]File[/JAPI] tatsächlich die Ursache ist.

Es gibt keinen Grund [JAPI]File[/JAPI] durch ein eigenes Konstrukt auf basis einen kodierten String nachzubauen.

bye
TT


----------



## SlaterB (4. Jan 2013)

File ist auch überraschend leere Klasse, enthält nur intern einen String,

mit hunderttausenden Dateien kann man sicherlich den Standard-Arbeitsspeicher beanspruchen,
spätestens mit zugewiesenen GB aber dann doch eher schwer

wenn überhaupt gibt es Datenbanken zum effizienten Vorhalten großer Datenmengen mit Suche usw.


----------



## Schlaftablette (4. Jan 2013)

Besten dank.

hatte dies schon mal in VBA über SQL programmiert, und versuche da nun über java.
Datenbank oder verteiltes rechnen kommt vielleicht später noch dazu.


----------



## Schlaftablette (16. Jan 2013)

Hi

Ich habe noch eine Frage zum File-Objekt

Mir ist aufgefallen, daß ein paar Routinen ziemlich lange dauern, wie z.b. .isDirectory()
Wird da erst bei der Anfrage geprüft, ob dies ein Ordner ist oder schon bei der Instanzierung ???

Die Filegröße wird ja immer beim aufruf der instanz neu eingelesen, hmmm, dauert bei vielen Files am Netzwerk sehr lange :-(


----------



## faetzminator (16. Jan 2013)

Was heisst ziemlich viel Zeit?
Gut möglich, dass diese Daten lazy initialisiert werden. Warum schaust du nicht einfach den Quellcode an? Ich behaupte, dass in [c]public abstract int getBooleanAttributes(File f);[/c] das Lazy Init passiert.


----------



## SlaterB (16. Jan 2013)

im Netzwerk kann alles lange dauern, File über Betriebssystem, DB-Zugriff, sonstiger Programmaufruf,
das muss mit Java, Entscheidung String, File, DB usw. nicht unbedingt etwas zu tun haben

allerdings kann es sich schon anbieten statt auf vielleicht 100 Files einzeln langsam zuzugreifen 
auf anderen Rechner jemand zu haben der sich um alles kümmert (dort normal schnell) und nur 1x auf Ergebnis-Nachricht zu warten


----------



## Schlaftablette (16. Jan 2013)

hmm, ja, die verteilte programmierung kommt noch, auch SQL hab ich derzeit keinen zugriff,, kommt vielleicht auch noch.

Ich versuche jetzt (zum ersten mal) eine Bestehende Klasse (File) zu erweitern, und weitere Daten zu speichern, da ich noch viel mehr auswertungen mache, und nun dauerts dann schon ne weile.

Es geht hier (für denAnfang) mal um ca. 250k Files auf dem netzlaufwerk.

Danke wiedermal !


----------



## Timothy Truckle (16. Jan 2013)

Schlaftablette hat gesagt.:


> Wird da erst bei der Anfrage geprüft, ob dies ein Ordner ist oder schon bei der Instanzierung ???


Da man ein [JAPI]File[/JAPI] Objekt auch mit einem ungültigen Pfad erstellen kann werden die Eigenschaften wohl erst beim Aufruf der entsprechenden Methode aus dem Filesystem geholt...

bye
TT


----------



## Schlaftablette (16. Jan 2013)

hmm, ja, bedeutet für mich aber eine viiiel längere Laufzeit.

habe jetzt die Klasse File1 angelegt, abgeleitet von File, wo ich die eine oder andere Methode umschreibe, sodaß nicht jedesmal geprüft wird.

Ich konnte es überall, bis auf eine zeile umschreiben, hier bekommeich weiterhin den Fehler "Type mismatch: cannot convert from element type File to File1"

Hier ein Codeauszug:

```
File1 dir = new File1(Laufwerk);

		for (File1 Dateielement : dir.listFiles()) { // <<-- Hier liegt der Fehler bie dir-listfiles()
				if (Dateielement.isFile()){
					filelist.add(Dateielement);
				}
				if (Dateielement.isDirectory()){
					Ordner_noch_einzulesen.add(Dateielement);
					filelist.add(Dateielement);
				}
			}
```

Ich habe dir als File1 angelegt, warum will er unbedingt bei .listFiles das File-objekt ??


----------



## SlaterB (16. Jan 2013)

wie sieht denn File1 aus, hast du listFiles() überschrieben und erzeugst File1-Objekte?
ansonsten macht File selber Arbeit und wird gewiss nicht File1-Objekte erzeugen, 
es kommen File-Objekte heraus

nur eine Klasse zu schreiben ändert nicht automatisch auf magische Weise alles


----------



## Bernd Hohmann (16. Jan 2013)

Schlaftablette hat gesagt.:


> Mir ist aufgefallen, daß ein paar Routinen ziemlich lange dauern, wie z.b. .isDirectory() Wird da erst bei der Anfrage geprüft, ob dies ein Ordner ist oder schon bei der Instanzierung ???



Erst bei der Anfrage, sonst wären grosse File-Arrays kaum handhabbar.

Bernd


----------



## Schlaftablette (16. Jan 2013)

SlaterB hat gesagt.:


> wie sieht denn File1 aus, hast du listFiles() überschrieben und erzeugst File1-Objekte?
> ansonsten macht File selber Arbeit und wird gewiss nicht File1-Objekte erzeugen,
> es kommen File-Objekte heraus
> 
> nur eine Klasse zu schreiben ändert nicht automatisch auf magische Weise alles



Danke, hat mir geholfen, zumindest bei der einen Methode, dafür jetzt bei einer anderen:

Die Methode listFiles hab ich in der File1-Methode überschrieben auf das Objekt File1
Jetzt will ich die Roots auslesen, nur die ist statisch, bekomme eine Fehlermeldung erst während der Laufzeit, er kann die nicht Casten


```
@Override
	public File1[] listFiles() {
		return (File1[]) super.listFiles();
	}
	
	public static File1[] listRoots(){
		return (File1[]) File.listRoots();
	}
```

wie komme ich hier an meine statische Methode ???:L

Hoffe beim listFile bin ich am richtigen weg, konnte es ja auch noch nicht testen.


----------



## SlaterB (16. Jan 2013)

Casten bewirkt dahingehend nichts,
wenn du File1-Objekte haben willst, dann muss auch irgendwo irgendwer File1-Objekte erstellen, also viele 

einfach zu bedenken

du musst schon

```
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;
    }
```
komplett überschreiben, genau den gleichen Code ausführen und statt 'new File' eben 'new File1'-Objekte erzeugen,
das Array auch vom richtigen Typ erstellen, 
+ Rückgabetyp ändern, was aber nicht ganz zwingend ist wenn etwa manschmal durch Interface vorgeben

falls File1 von File erbt und File1[] erzeugt wurde und richtig befüllt, 
dann kann es tatsächlich im Programm nötig und sinnvoll sein, irgendwo File[] auch auf File1[] zu casten 

----

oftmals hat man nicht die Möglichkeit oder es wäre unschön, den kompletten Code selber zu kopieren/ zu ändern,

grundsätzlich gibt es dann als alternatives Vorgehen, das File[] normal erstellen zu lassen, in der überschriebenen Methode z.B. mit super.listFiles(),
dann aber immer noch ein neues Array zu erzeugen und jedes einzelne normale File-Objekt durch ein eigenes zu wrappen/ ersetzen

das dürfte für die statische Methode nötig sein


----------



## Schlaftablette (16. Jan 2013)

so, hab jetzt einiges umgeschrieben und in die Klasse implementiert.
Funktioniert, nur mit der Geschwindigkeit bin ich noch nicht ganz zufrieden.

mal schauen, wann ich euch erneut um Hilfe anbettle

lg S.


----------

