Метод URLConnection.guessContentTypeFromStream
состоит в том, чтобы посмотреть на первые байты, так называемое волшебное печенье для идентификации файла.
Разработчики решили оставить Stream в неизмененном состоянии., поэтому продолжение чтения начнется (снова) с начала.
Для этого он делает reset():
с предыдущей отмеченной позицией потока (фактическое начало).
static public String guessContentTypeFromStream(InputStream is)
throws IOException {
// If we can't read ahead safely, just give up on guessing
if (!is.markSupported())
return null;
is.mark(16);
int c1 = is.read();
int c2 = is.read();
int c3 = is.read();
...
int c14 = is.read();
int c15 = is.read();
int c16 = is.read();
is.reset();
....
Дляпоследовательный FileInputStream markSupported()
возвращает значение по умолчанию false
.
Это можно решить, обернув FileInputStream
в BufferedInputStream
, что в любом случае будет быстрее.
String fileType = URLConnection
.guessContentTypeFromStream(
new BufferedInputStream(Files.newInputStream(Paths.get("C:\\image.jpeg")))
);
Обратите внимание, что Files.newInputStream
, как указано в javadoc, не будет поддерживать маркировку позиции для сброса.
(Использование ByteArrayInputStream
будет слишком большой нагрузкой.)