一部の Java ファイル処理コードのテストを作成しており、すべてのファイルが適切に閉じられていることを確認したいと考えています。「lsof」を実行したくありません。これにより、より多くのファイルが開かれ、テスト スイートが移植できなくなるからです。誰でもこれを行う方法を知っていますか?
1 に答える
JDK の一部を探している場合、答えはノーです。
JVMTIを使用するものを見つけるかもしれませんが、それは移植できません (ネイティブ インターフェイスです)。または、JPDAを使用するものですが、2 つ目の JVM が必要になります。グーグルの出発点として、これら2つの頭字語を紹介します。
JVM 内で実行して移植可能にしたい場合は、ファイル参照用のファクトリを導入する必要があります。すべてnew FileInputStream()
の 、new FileOutputStream()
、new RandomAccessFile()
、new FileReader
およびnew FileWriter
呼び出しをそのファクトリ オブジェクトのメソッドに置き換えます。このファクトリは、close()
メソッドがオーバーライドされたこれらのオブジェクトのサブクラスを返します。また、「開いているファイル」カウンターをインクリメントし、オーバーライドされた によってデクリメントしますclose()
。
ファクトリ メソッドとカウンタは静的で同期されている必要があり (ファクトリを注入する場合を除く)、システム プロパティを使用して、サブクラス化されたストリームまたは JDK バージョンのどちらを返すかを決定する必要があります。
個人的には、コメントのアドバイスを参考にして、最初に FindBugs を使用します。