SAXパーサーの parseメソッドに渡した InputStream の後始末
org.xml.sax.helpers.XMLReaderFactory.createXMLReader() で返されるパーサーの parseメソッドにInputSourceの引数で渡している InputStream が
処理後、closeしていなかったので、リソースが解放されていない可能性を調べてみた。
lsof -p プロセスID|grep ファイル名
オープンしていたファイルはしばらくして表示されなくなったので close されているようだ。
XMLReaderFactory.createXMLReader() で返されるパーサーの実態クラスは org.apache. xerces . parsers.SAXParser
念のため parseメソッドを呼び出して処理後に InputStream の read をしてみると "Stream Closed" の IOException が発生した。
このパーサーオブジェクトの parseメソッドにInputSourceの引数として渡した InputStream はparseメソッド内で close されているので、呼び出し側はcloseする必要がなかった。
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; // ... File file = new File(fileName); InputStream input = null; try { input = new FileInputStream(file); XMLReader xmlRaeder = XMLReaderFactory.createXMLReader(); xmlReader.parse(new InputSource(input)); // ... } catch(IOException x) { // ... } catch(SAXException x) { // ... } finally { // 正常時は xmlReader.parseで InputStrem は close されている。 if (input != null) { try { input.close(); } catch(IOException x) { .. } } }
※ java のバージョンは1.6.0_26