Image I/Oで対応している画像フォーマットのファイル拡張子を調べる

Image I/Oで対応している画像フォーマットの名前やMIMEタイプを調べるには、javax.imageio.ImageIOクラスのgetReaderFormatNamesメソッドやgetReaderMIMETypesメソッドを使えば良い。でも意外なことに、ImageIOクラスにはファイル拡張子を調べるメソッドはない。
でもIIORegistryクラスのgetServiceProvidersメソッドで、プラグインに対応するImageReaderSpiやImageWriterSpiを取得すれば、そのgetFileSuffixesメソッドで対応するファイル拡張子を取得できる。
例えば、読み込み可能な画像ファイルを拡張子でフィルタするFileFilterを、以下のように書くことができる。ただし下記のコードだと、拡張子が大文字の場合に対応できないので注意。

/**
 * 読み込み可能な画像ファイルを拡張子でフィルタするFileFilter。
 */
public class ImageReaderFileFilter implements FileFilter {
    /** 対応するファイル拡張子(ドット「.」も含む) */
    private String[] m_suffixes;

    /** コンストラクタ */
    public ImageReaderFileFilter() {
        // 利用可能なImageReaderのSPIから、対応しているファイル拡張子を集める
        IIORegistry registry = IIORegistry.getDefaultInstance();
        Iterator<ImageReaderSpi> spiItr = 
            registry.getServiceProviders(ImageReaderSpi.class, false);
        List<String> suffixList = new LinkedList<String>();
        while(spiItr.hasNext()) {
            ImageReaderSpi spi = spiItr.next();
            suffixList.addAll(Arrays.asList(spi.getFileSuffixes()));
        }
        m_suffixes = suffixList.toArray(new String[0]);
    }
    
    /**
     * 対応する拡張子のファイルか判定する。
     * @return 対応する拡張子ならtrue、それ以外はfalseを返す。
     */
    public boolean accept(File file) {
        for(String suffix : m_suffixes) {
            if(file.getPath().endsWith(suffix)) {
                return true;
            }
        }
        return false;
    }
}