Подтвердить что ты не робот

Какая разница в использовании InputStream вместо FileInputStream при создании объекта FileInputStream

Это может быть глупо, но я хочу знать разницу в работе фона.

  • InputStream is = new FileInputStream(filepath);
  • FileInputStream is = new FileInputStream(filepath);

В чем разница между этими двумя строками кода и в каких сценариях они используются.

4b9b3361

Ответ 1

FileInputStream extends InputStream: это специализированная версия InputStream, предназначенная для чтения файлов.

Существует несколько реализаций InputStream в соответствии с их использованием.

Обычно рекомендуется использовать самый высокий тип, необходимый для вашего кода. Поэтому, если вашему коду нужно читать данные из InputStream, но не специально из FileInputStream, вы должны использовать InputStream. Однако, если вам нужно сохранить информацию о вашем объекте FileInputStream, а не только InputStream, тогда вы должны сохранить тип FileInputStream.

Ответ 2

Нет никакой реальной разницы. FileInputStream extends InputStream, и поэтому вы можете назначить объект InputStream объектом FileInputStream. В конце концов, это тот же объект, поэтому будут выполняться те же операции.

Это поведение называется Polymorphism и очень важно в объектно-ориентированном программировании.

Ваша первая строка кода, вероятно, более желательна, чем вторая, поскольку она не блокирует вас в FileInputStream.

Это одна из сильных сторон объектно-ориентированного программирования. Не указывая тип, вы можете изменить тип потока, который вы используете позже. Если вы уверены, что вам понадобится только FileInputStream, используйте вторую строку кода.

Ответ 3

Как и в другом состоянии ответа, нет никакой разницы в поведении. Это все тот же объект, и будут выполнены одни и те же методы. Вы можете назначить объект любого типа, который наследует InputStream к этой переменной.

Однако то, о чем никто не упоминал до сих пор: вы можете только вызывать операции, объявленные в InputStream для этой переменной. Если FileInputStream предложит некоторые дополнительные операции, компилятор вызовет ошибку, если вы попытаетесь вызвать его. В этом случае вам нужно использовать FileInputStream как тип переменной.

Ответ 4

Другие ответы довольно сильно прибили его, но я хотел бы добавить следующий бит.

Если тип ссылочной переменной is является строго внутренней детализацией реализации вашего класса, то есть никто другой класс никогда не узнает об этом, прямо или косвенно, тогда действительно нет разница между этими двумя утверждениями, хотя я бы запрограммировал более базовый тип (InputStream) только потому, что.

Однако, если есть хоть малейший намек на утечку специфического поведения FileInputStream через интерфейс вашего класса, без этого существенного для проблемы, которую вы пытаетесь решить, вы всегда должны программировать более базовый тип.

Конечно, это общепринятая практика и применяется к более чем InputStreams и тому подобное.

Ответ 5

Нет никакой разницы. В каждом случае вы создаете FileInputStream. Первый, вероятно, лучший стиль программирования, в котором вы обычно должны использовать классы interface вместо конкретного класса, чтобы обеспечить гибкость (т.е. Вы решили использовать BufferedInputStream).