2012-10-30 5 views
8

Ich schreibe Tests für einige Java-Datei-Handling-Code und möchte sicherstellen, dass alle Dateien ordnungsgemäß geschlossen sind. Ich möchte 'lsof' nicht ausführen, da dies mehr Dateien öffnet und die Testsuite nicht portabel macht. Weiß jemand einen Weg, dies zu tun?Gibt es eine Möglichkeit, herauszufinden, wie viele Dateien eine JVM von der VM aus geöffnet hat?

+0

Siehe auch: http://stackoverflow.com/questions/1661322/too-many-open-file-handles – Puce

Antwort

2

Wenn Sie nach etwas suchen, das Teil des JDK ist, ist die Antwort nein.

Sie könnten etwas finden, das JVMTI verwendet, aber das wäre nicht portabel (es ist eine native Schnittstelle). Oder etwas, das JPDA verwendet, aber das würde eine zweite JVM erfordern. Ich gebe Ihnen diese zwei Akronyme als Start für das Googeln.

Wenn Sie in-JVM ausgeführt werden soll und tragbar sein, erhalten Sie eine Fabrik für die Dateireferenzen einführen müssen: Ersetzen Sie alle new FileInputStream(), new FileOutputStream(), new RandomAccessFile(), new FileReader und new FileWriter Anrufe mit Methoden, die auf diesem Factory-Objekt. Diese Factory gibt Unterklassen dieser Objekte zurück, bei denen die Methode close() überschrieben wurde. Es wird auch einen "open files" -Zähler inkrementieren, der dann von dem überschriebenen close() dekrementiert wird.

Die Factory-Methoden und der Zähler müssen statisch und synchronisiert sein (es sei denn, Sie möchten die Factory einspeisen) und sollten eine Systemeigenschaft verwenden, um zu entscheiden, ob ein unterklassierter Stream oder die JDK-Version zurückgegeben werden soll.

Persönlich würde ich den Rat in dem Kommentar nehmen, und FindBugs zuerst verwenden.

Verwandte Themen