6

どちらもデータの「ストリーム」であることがわかります。その場合、なぜそれらを異なると考えるのですか?本当に違いは何ですか?

コメント-この質問を閉じないでください。それは面接で人々を混乱させることができる基本的な種類のものです。

更新1-誰もが同じことを言っているようです-あなたはISから読み取り、OSに書き込みます。つまり、基本的に同じです。水が流れるパイプのように。そのパイプからの水を使用するときはそれをInputStreamと呼び、水をそのパイプに送り込むときはそれを出力ストリームと呼びます。それは本当に些細なことですか?

UPDATE2- 違いがそれほど「大きくない」場合、2つのクラス(InputStreamとOutputStream)のコードを作成する代わりに、InAndOutStreamを使用できますか?

4

7 に答える 7

16

それらは概念的に異なります

  • あなたからInputStream読んだ
  • あなたにOutputStream書く
于 2012-12-17T07:52:46.120 に答える
5

ストリームは、順番にアクセスするデータです。電車がトンネルの入り口から1両ずつしか見えないように見ているようなものです。または、一連の部品がコンベア ベルトを横切り、各部品のネジを締めてから組み立てラインの次の人に渡し、ハンマーでたたきます。または、橋から見ながら川を下る棒。

内部でどのように動作するかに関係なく、すべてのストリームは、それらを使用するプログラムに対して同じ単純なモデルを提示します。ストリームは一連のデータです。プログラムは入力ストリームを使用して、一度に 1 項目ずつソースからデータを読み取ります。 IO ストリーム

プログラムは、出力ストリームを使用して、一度に 1 項目ずつデータを宛先に書き込みます。 IO ストリーム

于 2012-12-17T08:08:56.630 に答える
4

違いがそれほど「大きく」ない場合、2 つのクラス (InputStream と OutputStream) のコードを作成する代わりに、InAndOutStream を使用できますか?

これは、ByteArray クラスを除いて不可能です。その理由は、ほとんどのストリームが、ファイルやソケットなどのシステム提供のデバイスによって支えられているためです。ファイルの場合、書き込むファイルは読み取り元のファイルですが、ソケットの場合、書き込み先のストリームは読み取り元のストリームから独立しています。

それらを組み合わせようとしても、人々はテキスト ストリームとバイナリ ストリームの間で十分に混乱するため、私見では悪い考えです。彼らが同じストリームに読み書きできるとしたら、さらに混乱するでしょう。

一般に、開発者は、デバイスから読み取りまたは書き込みを行っているかどうかについて明確な考えを持っている必要があります。それが彼らに明確でない場合、あなたは問題を抱えているに違いありません.

参考までに、「パイプ」のようなメモリストリームであなたが提案したことを正確に実行するライブラリを作成しました;)ただし、それは専門家の開発者向けであり、それでも混乱を防ぐためにインターフェイスをできるだけ明確に保ちます。

于 2012-12-17T08:39:35.953 に答える
2

から読み取りInputStream書き込みますOutputStream。それが両者の主な違いです。

場合によっては、読み取りと書き込みの両方ができる必要があります。そのような例の1つは、ストリームソケットです。Javaライブラリがこれを処理する方法は、InputStream とを使用することOutputStreamです。

于 2012-12-17T07:52:06.267 に答える
2

ストリームの概念は、質問で暗示しているほど対称的ではありません。これは Java であるため、ストリームのリーダーとライターは実行環境で根本的に異なる位置を占めます。1 つはストリーム オブジェクトを実装し、もう 1 つはストリーム オブジェクトのメソッドを呼び出します。

したがって、言語はモデルに非対称性を強制するため、Java の I/O 機能の実装者は、ストリームの読み取り側と書き込み側のどちらを占有するかを事前に決定する必要があります。施設の利用者には選択の余地がありません。たとえば、次のようになります。ユーザーからデータを受け取る I/O 機能を実装するには、OutputStream(ユーザーが書き込みを行うために呼び出す) を実装する必要があります。

対称機能を実装するには、言語でコルーチンを実行できる必要があります。その場合、ストリームには読み取りと書き込みの両方の側面があり、呼び出し側が書き込みを試みると読み取り側に渡ります (その逆も同様です)。ただし、Java はそのような機能をサポートしていません。(少なくともマルチスレッド以外では、ほとんどの状況で明らかに重すぎるでしょう。)

それがもう少し明確になることを願っています。

于 2012-12-17T08:06:29.670 に答える
0

私の最善の策は、ユーザーがストリームを読み取るだけの場合に、それらを小さく保つことです。なぜ、ストリームへの書き込みに使用される関数をロードするのでしょうか。これは純粋に私の推測に基づいていますが...

編集:私はファイルという言葉でばかげていました、ストリームはファイル以上に使用することができます。

于 2012-12-17T07:53:42.330 に答える