Есть множество способов сделать это; см. другие ответы и ссылки на связанные вопросы. (Подход Java 7 кажется мне наиболее привлекательным, поскольку по умолчанию он использует соглашения, специфичные для платформы, и вы можете указать собственную схему определения типа файла.)
Однако я хотел бы отметить, что ни один механизм не является полностью непогрешимым:
Методы, использующие суффикс файла, будут обмануты, если суффикс нестандартный или неправильный.
Методы, основанные на атрибутах файла (например, в файловой системе), будут обмануты, если файл имеет неверный атрибут типа содержимого или его нет вообще.
Методы, основанные на проверке сигнатуры файла, могут быть обмануты двоичными файлами, которые, как оказалось, имеют одинаковые байты подписи.
Даже если вы просто пытаетесь прочитать файл как изображение, его можно обмануть, если вам не повезло ... в зависимости от формата (ов) изображений, которые вы пытаетесь.