URLConnection#guessContentTypeFromStreamによるコンテンツタイプ判定時の注意

URLConnection#guessContentTypeFromStreamメソッドを用いると、ファイルのコンテンツタイプを判定することができる。
ただし入力するInputStreamによっては正しく判定がされない場合があるため注意。

ソース(https://github.com/unofficial-openjdk/openjdk/blob/342a565a2da8abd69c4ab85e285bb5f03b48b2c9/src/java.base/share/classes/java/net/URLConnection.java#L1467-L1646)を見るとわかるが、メソッドの先頭でmarkSupported()をチェックしている。このとき引数のInputStreamがmarkSupported()の呼び出しに対してfalseを返すと一切判定されずnullが返ってしまう。

これを回避する一つの方法として、引数に渡すInputStreamをBufferedInputStreamでラップすれば良い。

以下が正しく動作する例。

String contentType = URLConnection.guessContentTypeFromStream(new BufferedInputStream(new FileInputStream(file))));

参考(https://blog.magnolia.tech/entry/2018/06/01/064208)