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; } }