2012-07-31 15 views
6

Fileインスタンスを作成せずに、InputStreamのサイズをバイト単位で取得する必要があります。 Java NIOを使用する方法はありますか?Java InputStreamのサイズ

+2

をチェック! – Jeffrey

+3

'InputStream'の契約は、それが有限であることを強制することに関して何も言いません。 – oldrinb

+1

またはそれが事前に定義されていることに関して。 – EJP

答えて

24

一般的にInputStream?ストリームの最後に来るまで、読み込んだバイト数を数えて、読み込みと読み込みを続けなければなりません(たとえば、同じバッファに何度も何度も読んだことがあります)。

もちろん、データそのものを読み取ることはできません。そうしたい場合は、データを読んだままにしておく必要があります。 ByteArrayOutputStreamにコピーしてください。

(データを処理するのと同時に処理することができる場合は、ループを使用して読み取り、毎回同じバッファに読み込み、カウンタを増分して記録するどのくらいあなたは読んだあなたは本当に私たちにあなたがストリームに何をしたいかについての情報を提供していない)

+1

または、あなたが行くにつれてそれをコピーして、カウントとByteArrayOutputStreamとレイテンシとスペースを無駄にすることなく、すべてをメモリにコピーしてください。 – EJP

+0

@EJP:それは後で何をするつもりかによって決まります。それを目的地にまったくコピーしていない可能性があります。 –

+0

そうしている間にそれを読んで処理してください。私は入力が非常に小さいことが分かっていない限り、入力全体を読むことによって始まる「解決策」は非常に疑いがあります。その場合、あなたはほとんどどんなサイズであるかを知る必要はほとんどありませんか? – EJP

1

追加オプションのカップル:。。の阻止性質によって

ストリーム上でavailable()と呼ぶことができます。

ストリームが小さい場合は、PushbackInputStreamに書き込み、バイト数をカウントして巻き戻します。

+1

-1。 available()はストリームのサイズを返しません。そのような警告がJavadocにあります。 *すべての入力ストリームがブロックされています。 – EJP

+6

矛盾する必要があります。 JavaDocをチェックしてください。 http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#available%28%29。 available()の戻り値は、**ブロッキングなしで読み取ることができるバイト数**であることを指定します。さらに、「低速ネットワーク上で大容量のファイルを読み取る場合など、一部のケースでは、非ブロック読み取り(またはスキップ)が単に遅い場合にブロックされているように見える場合があります。また、FileInputStreamの場合は、しばしばサイズの信頼できる指標になります。 – Nicholas

+2

それはまさに私が言ったことです。あなたが言ったのとまったく逆の*です。available()を使用して入力ストリームのサイズを返すことができますが、これはこの質問のトピックです。これは、ブロックせずに読み取ることができるバイト数と同じではありません。ソケットを考えてみましょう。 「さらに」の後の部分には、明らかな関連性はありません。あなたの最後の文での使用に対して特に警告する別の文がありますが、FileInputStreamについては何の質問もありません。 – EJP

6

原則として知ることはできません(書き込みを停止しないピアを考えてください)、あなたはそれを必要としません。固定サイズのバッファを使ってループを読み書きするだけです。 NIOは魔法の解決法を提供しません。

-2

あなたはUtils.javaのGetBytesメソッド(InputStreamを)使用してInputStreamのサイズを取得することができますが、これが必要になりますなぜ、この次のリンク

Get Bytes from Inputstream

+0

つまり、ストリームの終わりまでストリームを読み込むか、または文書化されていないByteArrayInputStreamのプロパティに依存します。非常に品質の低いリンクです。質問に指定されたNIOは使用しません。 -1 – EJP

関連する問題