あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

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