В системах на базе Linux / Unix вы можете использовать команду file, но я предполагаю, что вы хотите сделать это вручную в коде ...
Если все, к чему у вас есть доступ, - это поток байтов файла, вам нужно будет обрабатывать каждый тип файла независимо.
Большинство программ / компонентов, которые делают то, что вам интересно, обычно читают первые несколько байтов и делают классификацию на основе этого. Например, файлы GIF начинаются с одного из следующих: GIF87a или GIF89a
Многие форматы файлов имеют одинаковую подпись в начале файла или имеют одинаковый формат заголовка. Эта подпись упоминается как магическое число, как я описал в этом посте .
Хорошее место для начала - зайти на www.wotsit.org . Он содержит спецификации формата файла с возможностью поиска по типу файла. Вы можете посмотреть на важные типы файлов, которые вы хотите обработать, и посмотреть, сможете ли вы найти какой-то определяющий фактор в этих форматах файлов.
Вы также можете выполнить поиск в Google, чтобы найти библиотеку, которая выполняет эту классификацию, или посмотреть исходный код команды file.