2013-12-18 40 views
5

私はいつも不思議だった:ストリームの終わりは何ですか?入出力ストリーム:ストリームの終わり?

java.ioパッケージのほとんどのreadLineメソッドのjavadocでは、ストリームの終わりに達した場合にnullを返します。私が最も頻繁に使用するネットワークストリームの場合)は、何かがリモートエンドのストリームに書き込まれるまでプログラムの実行をブロックするだけです。

実際の非例外的な投げ方でこの事実を起こす方法はありますか?私は単に興味があります。

+0

FileInputStreamでファイルを読み取ります。 –

+0

正確にどのような行動を強制するのですか?何か他のものが利用できるようになるまでプログラムをブロックすることを意味しますか? –

+0

readLine()でネットワークストリームから読み込むときにReaderがnullを返すようにします。 – salbeira

答えて

8

ファイルが読んでいると考えてください。そこにストリームの終わりがあり、ファイルの終わりです。あなたがそれを超えて読むことを試みるならば、あなたは単にできません。ただし、ネットワークに接続している場合は、さらにデータが送信されるのを待つだけでストリームの終わりにする必要はありません。

ファイルの場合、私たちは、読み取るべきデータがもうないという事実を知っています。ネットワークストリームの場合、私たちは(通常)しません。あるときFileReaderそれ以上データが利用できない、目覚めブロッキング

簡単な答えは:あなたができません。基本的な違いは、ファイルを積極的に読むことですが、ネットワークストリームを聞くと、あなたは受動的に読むことになります。何かがネットワークから来たら、あなたのハードウェアは短い信号をオペレーティングシステムに送ります。オペレーティングシステムは新しいデータをJVMに渡し、JVMはプロセスを起こして新しいデータを読むようにします。しかし、少なくともすぐには、ファイルを持っているわけではありません。

あなたが持っているStreamReaderのラッパーを作成し、ファイルが変更されたときに通知されるリスナーを作成して、さらに読むことを目覚めさせることが考えられます。 Java 7ではWatchServiceを使用できます。

+0

実際には、リモート側のソケットを閉じることによってnullを返すようにリーダーを取得することができました。明らかにストリームは終了しましたが、文字通り終了したことを読み取るよう指示するインジケータも設定されています)...これは、リモートエンドが接続を閉じるときにクリーンアップコードを挿入するのを待っている瞬間です! – salbeira

+0

['configureBlocking'](http://docs.oracle.com/javase/7/docs/api/java/nio/channels/spi/AbstractSelectableChannel.html#configureBlocking(boolean))と[' available' ](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream。html#available()) –

0

ある時点で、ソケットは閉じられ、そのストリームを介して送信できるデータはもうありません。これは、read()とその過負荷から-1を返すことによってInputStreamがEOFを通知するときです。この状態は元に戻せません。その流れは死んでいる。

オープンストリームでより多くのデータをブロックすることは、EOF条件ではありません。

+0

EOFとEOS(tream)の正確な違いは何ですか? - 「文字コード」のような回答も有効です – salbeira

+0

@salbeira違いはなく、実際にはストリーム上でデータが送信されません(またはファイルから読み取られます)。この結果は 'InputStream'実装クラスによって生成されます。これはロジックの結果であり、帯域内信号ではありません。 – erickson

1

何かがリモートエンド

にストリームに書き込まれるまで(私が最も頻繁に使用するネットワークストリームの場合)ほとんどのストリームは、単にプログラムの実行をブロックするように私は実際には、ヌルをやったことがなかったです

いいえ、ピアは決して接続を閉じなかったので、あなたは決してヌルを持っていません。それは「ストリームの終わり」が意味するものです。それは「当分の間はデータがなくなった」という意味ではありません。

関連する問題