前回のエントリの続きです。
前回はファイル名から…つまり拡張子をもとにMIME Typeを特定する方法を紹介しましたが、今回はファイルの内容からMIME Typeを推測する方法です。
Files.probeContentType
前回も紹介した下記のブログエントリに、カスタマイズ方法が記載されていますが、Files.probeContentType
がMIME Typeを決定するアルゴリズムはカスタマイズ可能で、java.nio.file.spi.FileTypeDetector
を継承したクラスを作成し、サービスとして登録します。
デフォルトのアルゴリズムでは、ファイル名を元にMIME Typeを決定しているので、独自にロジックを書けばファイルの内容からMIME Typeを推測することが可能になります…が、ちょっと使うにはかなりハードルが高いですし、汎用的に作ろうとすると異常な努力が必要になってくるので、アプリケーションの仕様から特定のフォーマットを識別したい、という時以外は採用は厳しそうです。
URLConnection.guessContentTypeFromStream
URLConnection.guessContentTypeFromName
はファイル名(拡張子)からMIME Typeを特定していましたが、java.io.InputStream
からの入力(つまりデータの中身そのもの)からMIME Typeを推測するメソッドがURLConnection.guessContentTypeFromStream
です。
いきなりopenJDKのソースへのリンクを張っておきますが、実装を見ると主にtext/html
、application/xml
、image/gif
、image/png
、image/jpeg
あたりの判定には使えそうです(それ以外は…なぜそれを判定対象にした?という感じの並びですね…)。
判定ロジックがべた書きされているので、カスタマイズ方法は無さそうです。サブクラスを作れば別ですが、そうすると完全にロジックを書かないといけないので、これまた異常な努力が必要になりますね。
おわりに
ファイルの内容から推測する方法は、あまり汎用的な方法は(当然ですが)無いので、URLConnection.guessContentTypeFromStream
を使う以上の汎用性は求めない方が良さそうです。

- 作者: 中山清喬,国本大悟
- 出版社/メーカー: インプレス
- 発売日: 2014/08/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (19件) を見る