В данном случае мне надо достать значения из файла .properties. Я могу использовать для этого FileInputStream:
FileInputStream fis = new FileInputStream("src/main/resources/config.properties");
А могу обычный InputStream:
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("src/main/resources/initialData.properties");
В чем между ними разница?
FileInputStream - это поток ввода из файла, а InputStream - это просто поток ввода, откуда угодно. Но в вашем примере разница не в уровне абстракции потоков, а в способе доступа к ресурсам. В случае использования FileInputStream("src/main/resources/config.properties") вы сможете читать файл только в том случае, если в рабочем каталоге вашего приложения обязательно есть каталог src с соответствующими подкаталогами, содержащими необходимый файл. Что перестанет быть истинной после упаковки приложения в jar-файл. По крайней мере без дополнительных манипуляций с вашей стороны. Использование же getResourceAsStream позволит получить данные как из файла в каталоге, так и из jar-файла. Только путь придётся поменять с src/main/resources/initialData.properties на просто initialData.properties. Подробнее об именовании ресурсов можно почитать здесь.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей