2013-07-08 12 views
14

Dies ist vielleicht ein dummer, aber ich möchte den Unterschied im Hintergrund Betrieb wissen.Was ist der Unterschied bei der Verwendung von InputStream anstelle von FileInputStream beim Erstellen des FileInputStream -Objekts

  1. InputStream is = new FileInputStream(filepath);
  2. FileInputStream is = new FileInputStream(filepath);

Was ist der Unterschied zwischen den beiden obigen Zeilen Code ist und in welchen Szenarien werden sie eingesetzt.

+0

FileInputStream wird von InputStream abgeleitet - jede FileInputStream-Instanz ist notwendigerweise ein InputStream. Es gibt eine breite Präferenz, Deklarationen so abstrakt wie möglich zu machen. – user888379

+0

Es gibt keinen Unterschied, da Sie beide in beiden Fällen tun. – EJP

+1

Mögliches Duplikat von [Java - Deklaration vom Interface-Typ anstelle von Klasse] (http://stackoverflow.com/questions/3383726/java-declarging-from-interface-type-instead-of-class) – Tom

Antwort

19

FileInputStream erweitert : es ist eine spezialisierte Version eines InputStream für das Lesen von Dateien konzipiert.

Es gibt mehrere Implementierungen eines InputStream entsprechend seiner Verwendung.

Es ist normalerweise eine gute Übung, den höchsten in Ihrem Code benötigten Typ zu verwenden. Wenn Ihr Code also Daten von einem InputStream, aber nicht speziell von einem FileInputStream lesen muss, sollten Sie verwenden. Wenn Sie jedoch die Informationen Ihres Objekts als FileInputStream und nicht nur als InputStream aufbewahren müssen, sollten Sie den Typ FileInputStream beibehalten.

12

Es gibt keinen wirklichen Unterschied. FileInputStream erweitert InputStream, und so können Sie ein InputStream Objekt zu einem FileInputStream Objekt zuweisen. Am Ende ist es das gleiche Objekt, also werden die gleichen Operationen passieren.

Dieses Verhalten wird Polymorphism genannt und ist sehr wichtig in der objektorientierten Programmierung.

Ihre erste Codezeile ist wahrscheinlich wünschenswerter als die zweite, da sie Sie nicht in eine FileInputStream einsperrt.

Dies ist eine der Stärken objektorientierter Programmierung. Wenn Sie keinen Typ angeben, können Sie den Typ des Streams ändern, den Sie später verwenden. Wenn Sie sicher sind, dass Sie nur eine FileInputStream benötigen, verwenden Sie die zweite Codezeile.

2

Es gibt keinen Unterschied. In jedem Fall erstellen Sie eine FileInputStream. Der erste ist wahrscheinlich ein besserer Programmierstil, da Sie im Allgemeinen eine Klasse interface anstelle der konkreten Klasse verwenden sollten, um Flexibilität zu ermöglichen (d. H. Sie entscheiden sich für eine BufferedInputStream).

4

Wie der andere Antwortstatus gibt es keinen Unterschied im Verhalten. Es ist immer noch das gleiche Objekt und die gleichen Methoden werden ausgeführt. Sie können dieser Variablen ein Objekt eines beliebigen Typs zuordnen, der InputStream erbt.

Was bisher noch nicht erwähnt wurde: Sie können nur Operationen aufrufen, die in InputStream für diese Variable deklariert sind. Wenn FileInputStream zusätzliche Operationen bietet, würde der Compiler einen Fehler ausgeben, wenn Sie versuchen, ihn aufzurufen. In diesem Fall müssten Sie FileInputStream als Typ der Variablen verwenden.

3

Die anderen Antworten haben es ziemlich genagelt, aber ich möchte das folgende Bit hinzufügen.

Wenn der Typ der Referenzvariable is ausschließlich ein internes Implementierungsdetail Ihrer Klasse ist, d.keine andere Klasse wird jemals direkt oder indirekt etwas darüber erfahren, dann gibt es wirklich keinen Unterschied zwischen den beiden Aussagen, obwohl ich einfach gegen den grundlegenderen Typ (InputStream) programmieren würde.

Wenn jedoch auch nur der geringste Hinweis darauf vorhanden ist, dass das spezifische FileInputStream-Verhalten über die Schnittstelle Ihrer Klasse verloren gegangen ist, sollten Sie immer den grundlegenderen Typ programmieren, ohne dass dies für das zu lösende Problem wesentlich ist.

Natürlich ist dies eine allgemeine gute Praxis und gilt für mehr als InputStreams und dergleichen.

+0

Gute Ergänzung, gute Arbeit. –