javaでファイルの種類を判定する

javaでファイルの種類を判定する場合、mime-utilというライブラリを使うと便利らしい。
詳細は元のサイトを参照していただきたい。

2010/3/17追記:開発元のサイトが見れないので、sourceforge.netのリンクも追記しておく。
Mime Type Detection Utility download | SourceForge.net


検出アルゴリズムは次の通り

  • ExtensionMimeDetector
  • MagicMimeMimeDetector
  • OpendesktopMimeDetector
  • TextMimeDetector
  • WindowsRegistryMimeDetector

ExtensionMimeDetector

ファイル名の拡張子から、MIME-typeを予測するもっともシンプルな検出アルゴリズム

MagicMimeMimeDetector

UNIXのfile(1)コマンドと同じアルゴリズムに基づいてファイルの種類を判定する。
magic.mimeファイルのみ使用しているため、ファイルの中身のMIMEタイプは判別できるが、テキストファイルのエンコーディングなどは分からない。

windowsのようなfile(1)コマンドを持たないシステム上では、mime-util内蔵のmagic.mimeファイルが使われる。
file(1)コマンドを持っているシステム上では、内蔵のファイルは無視され、システムのmagic.mimeファイルが使われる。

システム毎に検出結果が異なると困るので、以下のような順番で使うmagic.mimeファイルを探す。

  • JVMプロパティmagic-mimeで指定されたファイル
  • クラスパス上にあるmagic.mimeファイル
  • ユーザのホームディレクトリにある.magic.mimeファイル
  • 通常のUNIXでのmagic.mimeファイルの存在するパス(/usr/share/file/magic.mime や /etc/magic.mime)
  • 内蔵のmagic.mimeファイル

OpendesktopMimeDetector

freedesktop.orgで開発が進められている、"shared MIME info"という名前のMIMEの検出のためのクロスプラットフォーム仕様のデータベースに基づいて検出する。

TextMimeDetector

サブクラス化できないし、
コードから登録したり、削除できない特別なMimeDetector

他のMimeDetectorから使われる。

WindowsRegistryMimeDetector

Windows上でのみ使うことができるMimeDetector
Windowsレジストリに登録されている拡張子に基づいてMIMEタイプを返す。

ちょっと使ってみた感想

JARファイルを検出させてみると、
ExtensionMimeDetectorだと、JARファイルだと認識するが、
MagicMimeMimeDetectorだと、ZIPファイルだと認識する。

JARファイルはZIPファイルそのものだから、当然だけど。