web-dev-qa-db-ja.com

FileInputStreamオブジェクトの作成中にFileInputStreamの代わりにInputStreamを使用することの違いは何ですか

これはばかげているかもしれませんが、バックグラウンド操作の違いを知りたいです。

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

上記の2行のコードの違いとそれらが使用されるシナリオ.

17
Mathan Kumar

FileInputStream extends InputStream:これは、ファイルを読み取るために設計されたInputStreamの特殊なバージョンです。

用途に応じて、InputStreamの実装がいくつかあります。

通常、コードで必要な最も高い型を使用することをお勧めします。したがって、コードがInputStreamからデータを読み取る必要があるが、特にFileInputStreamからデータを読み取る必要がない場合は、InputStreamを使用する必要があります。ただし、オブジェクトの情報をFileInputStreamだけでなくInputStreamのままにする必要がある場合は、FileInputStream型を保持する必要があります。

22
Jean Logeart

本当の違いはありません。 FileInputStreamInputStreamを拡張するため、InputStreamオブジェクトをFileInputStreamオブジェクトとして割り当てることができます。結局、同じオブジェクトなので、同じ操作が行われます。

この動作は Polymorphism と呼ばれ、オブジェクト指向プログラミングでは非常に重要です。

コードの最初の行は、FileInputStreamにロックされないため、おそらく2行目よりも望ましいでしょう。

これは、オブジェクト指向プログラミングの長所の1つです。タイプを指定しないと、後で使用するストリームのタイプを変更できます。ここでFileInputStreamだけが必要だと確信している場合は、コードの2行目を使用してください。

12

他の答えはそれをかなり釘付けにしましたが、私は次のビットを追加したいと思います。

参照変数isのタイプが厳密にクラスの内部実装の詳細である場合、つまり、他のクラスが直接または間接的にそれを検出することはないため、実際にはありません。より基本的なタイプ(InputStream)に対してプログラムを作成したとしても、2つのステートメントの違いは理由があります。

ただし、クラスのインターフェイスを介してFileInputStream固有の動作をリークするわずかなヒントさえある場合は、これが解決しようとしている問題に不可欠ではなく、常により基本的な型に対してプログラミングする必要があります。

もちろん、これは一般的な良い習慣であり、InputStreamsなど以外にも当てはまります。

4
dkateros

他の回答状態と同様に、動作に違いはありません。それでも同じオブジェクトであり、同じメソッドが実行されます。 InputStreamを継承する任意のタイプのオブジェクトをその変数に割り当てることができます。

ただし、これまで誰も言及していなかったことは、その変数のInputStreamで宣言されている操作のみを呼び出すことができるということです。 FileInputStreamがいくつかの追加操作を提供する場合、それを呼び出そうとするとコンパイラーはエラーをスローします。この場合、変数の型としてFileInputStreamを使用する必要があります。

3
André Stannek

違いはありません。どちらの場合も、FileInputStreamを作成します。 1つ目は、おそらく、柔軟性を可能にするために具象クラスではなくクラスinterfaceを使用する必要があるという点で、おそらくより優れたプログラミングスタイルです(つまり、BufferedInputStreamを使用することを決定します)。

2
John B