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