"Too many open files" bei Property List

  • Themenstarter Themenstarter KartoffelKiffer
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

KartoffelKiffer

Gast
Hallo,

ich habe eine Konfigurationsdatei, die als property gehalten wird. Also im Muster key=value\nkey=value ...

Ich habe eine öffentliche Klasse ReadConfig, welche einen Konstruktor enthält, der wiederrum ein Element private Properties erstellt.

Mittels this.properties.load(new FileInputStream(file)) fülle ich meine Properties mit einer Liste von Elementen aus der übergebenen Datei.

Möchte ich nun ein spezielles Elemenent haben, lese ich es in einer getProperty Funktion aus, die mir auch lediglich this.getPropery(key) zurück gibt. Das Ganze noch in einen try-catch Block gepackt, und das wars.

Jetzt bekomme ich seit einiger Zeit den Fehler, "Too many open files", welches genau auf die Datei zeigt. Es kann sein, dass MAXIMAL 20 Aufrufe der Datei gleichzeitig in einer Prozedur vorkommen, das aber auch wirklich selten.

Der Fehler tritt auch bloß sporadisch auf, sodass er schlecht reproduzierbar ist.

Habe ich vielleicht vergessen etwas zu schließen, das mir nicht bekannt ist? Der "Property-Reader" müsste doch das übergebene File von allein schließen, oder sehe ich das falsch?



Mfg Tom
 
wieso öffnest du die datei eigentlich immer wieder neu?

ich hab hier auch ein projekt, an dem ich mir Sprachdateien über die Properties erstellt habe - die entsprechende Datei wird ganz zu Anfang genau 1mal geladen und dann in ca. 10 anderen Klassen verwendet.
 
KartoffelKiffer hat gesagt.:
Habe ich vielleicht vergessen etwas zu schließen, das mir nicht bekannt ist? Der "Property-Reader" müsste doch das übergebene File von allein schließen, oder sehe ich das falsch?
Warum sollte er das tun? Du übergibst ja kein File, sondern einen InputStream - das kann ja alles mögliche sein: eine Socket-Verbindung, die Standardeingabe oder eben ein FileInputStream. Wenn der Stream wirklich nur die Property-Daten enthält, dann kann er nach dem Lesen geschlossen werden; i.A. wäre das aber nicht so gut.
Die Datei wird in deinem Fall erst dann geschlossen, wenn das FileInputStream-Objekt vom Garbage-Collector beseitigt wird - und falls das nicht rechtzeitig passiert, kommt der Fehler.

Es wäre aber wirklich besser, die Datei nur einmal zu lesen.
 
Wenn ich die Datei einmal zu Anfang lade, besteht den ganzen Tag nur die Version der Konfigurationsdatei, wie zu Anfang eingelesen.

Wobei mir gerade in den Sinn kommt das Objekt auch neu zu laden, sobald eine Änderung gemacht wird.

Das ist natürlich mit etwas Aufwand verbunden...
 
Klar, du solltest den Zugriff auf jeden Fall in eine eigene Klasse kapseln. Und in der Klasse kannst du dann ja entscheiden, ob die Datei gegenüber seit letzten Einlesen modifiziert worden ist und daher neu gelesen werden muss.

Trotzdem wäre ich mit zur Laufzeit änderbaren Properties vorsichtig.

Bsp:
Code:
PrintWriter dbg = null;
if ( "yes".equalsIgnoreCase( "getMyApplicationProperties().get( "debug"))) {
  dbg = new PrintWriter( "debug.txt");
}

/* ... */

if ( "yes".equalsIgnoreCase( "getMyApplicationProperties().get( "debug"))) {
  dbg.println( "mache dies und jenes");
}

/* ... */

if ( "yes".equalsIgnoreCase( "getMyApplicationProperties().get( "debug"))) {
  dbg.close();
}

Wenn sich jetzt während der Abarbeitung dieser Sequenz der Wert der Property ändert, wäre das nicht gut - zumindest während dieser Codesequenz sollte man von einem unveränderlichen Zustand ausgehen, oder man müsste wesentlich defensiver programmieren.

Das Beispiel ist natürlich an den Haaren herbeigezogen; normalerweise würde man ein Logging sicher anders implementieren, aber es geht ja um das Prinzip.
 
ich versteh das problem nicht...

wenn du was an den Properties änderst mit z.B. setProperty(), dann ist das erstmal nur in deinem properties-object.

also, wenn deine Änderungen nur intern im Programm sind, werden diese direkt in dem Objekt übernommen und du hast immer den aktuellen Stand.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben