Потому что хорошей практикой является программирование от интерфейсов. Хотя в данном случае InputStream абстрактный класс, но тем не менее. К примеру, если этот InputStream нужно будет в миллиард разных мест передавать, добавлять в миллион разных коллекций, типизированных FileInputStream, и вдруг понадобится изменить реализацию с FileInputStream на какую-то другую, то придется менять эту реализацию везде. А если везде в коде будет использоваться более общий тип InputStream, то без разницы какую ты реализацию будешь передавать в эти методы и добавлять в коллекции. Там везде стоит общий тип InputStream. Но если тебе понадобится вызывать конкретные методы, которые есть только в FileInputStream, то придется либо делать даункастинг до FileInputStream в том месте, где тебе понадобится их вызывать, либо лучше писать сразу так, как ты написал во втором случае и везде использовать FileInputStream. В общем, всегда стоит выбор, как лучше писать. Но по дефолту лучше использовать более общий тип, как в первом случае написано.