C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VBでStreamの読み込み位置を戻す操作


(過去ログ 31 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■14815 / inTopicNo.1)  VBでStreamの読み込み位置を戻す操作
  
□投稿者/ Dot (1回)-(2008/02/27(Wed) 13:41:32)

分類:[.NET 全般] 

こんにちは!VB.NETで質問です。

Streamクラスで、テキストストリームを読み込むとします。
その際ストリームの読み込み位置を進めるのはReadかReadByteを使います。

ストリームというやつについての知識がほとんどないのですが、読み込み位置を戻すという操作は、難しいことなのでしょうか?StreamReader等のPositionプロパティを使えば位置を変更することができますが、これは内部でどういう操作を行っているのでしょうか?今は苦肉の策としてストリームを閉じて読み込みなおすことで位置を最初に戻すというようにして、StreamReader等のPositionプロパティに似た操作を自作しています。これは大分おかしい操作であるように思います。

どのようにするのが正しいでしょうか?
引用返信 編集キー/
■14816 / inTopicNo.2)  Re[1]: VBでStreamの読み込み位置を戻す操作
□投稿者/ シャノン (304回)-(2008/02/27(Wed) 13:53:38)
No14815 (Dot さん) に返信
> こんにちは!VB.NETで質問です。
>
> Streamクラスで、テキストストリームを読み込むとします。
> その際ストリームの読み込み位置を進めるのはReadかReadByteを使います。
>
> ストリームというやつについての知識がほとんどないのですが、読み込み位置を戻すという操作は、難しいことなのでしょうか?StreamReader等のPositionプロパティを使えば位置を変更することができますが、これは内部でどういう操作を行っているのでしょうか?今は苦肉の策としてストリームを閉じて読み込みなおすことで位置を最初に戻すというようにして、StreamReader等のPositionプロパティに似た操作を自作しています。これは大分おかしい操作であるように思います。
>
> どのようにするのが正しいでしょうか?

Stream.Seek ってのがあります。Seek できない Stream がある点には注意ですけど。
引用返信 編集キー/
■14817 / inTopicNo.3)  Re[2]: VBでStreamの読み込み位置を戻す操作
□投稿者/ Dot (3回)-(2008/02/27(Wed) 13:59:46)
シャノンさん

回答ありがとうございます。とても助かります。

ただ、まだ気になることがあるんです。ReadやReadByteで進めるという操作に対して戻す操作がないのが解せません。Seekは任意の位置を指定・・・。明らかにRead等に対になるものではないように思います。Seekというのは、詰まるところ・・・内部ではどういう操作になっているのでしょうか?

そもそも、ストリームというのは読み進めると、なんでも読み戻ることができないのでしょうか?ソケット通信やデータベースのデータ読み込みでストリームを使うことがありますが、いまいち良くわかってない部分が多くて困っています。

質問ばかりになってしまいましたが、どうぞよろしくお願いします。
引用返信 編集キー/
■14821 / inTopicNo.4)  Re[3]: VBでStreamの読み込み位置を戻す操作
□投稿者/ Hongliang (246回)-(2008/02/27(Wed) 14:30:05)
Read は飽くまで主眼は「読む」ですよ。ついでに位置が進めば便利だからそういう実装になってるだけで。Read と Seek を一々セットで呼び出すのも面倒でしょ。
Stream にも Position プロパティありますし。というか StreamReader に Position は無いはずですが?

内部ではどういう操作かはストリームの実装次第です。
ファイルなんかはデータ元が全て手元にあるからシークできるでしょうが、データ元がネットワークの先とかだと聞きに戻ることができないってのは予想が付きませんか。
引用返信 編集キー/
■14824 / inTopicNo.5)  Re[3]: VBでStreamの読み込み位置を戻す操作
□投稿者/ 魔界の仮面弁士 (663回)-(2008/02/27(Wed) 14:39:39)
No14817 (Dot さん) に返信
> ReadやReadByteで進めるという操作に対して戻す操作がないのが解せません。
Seek や Position だと、なにかマズイのでしょうか? (CanSeek が False なストリームなのでしょうか?)
それとも、ReadByte してもカーソル位置を変えさせたくない事情がある、ということでしょうか。


> Seekというのは、詰まるところ・・・内部ではどういう操作になっているのでしょうか?
内部実装を見たい場合には、2008 を導入してみてください。
(たとえば MemoryStream だと、内部的には Byte の配列で保持しているようです)

http://salv.miscnotes.com/2008/01/net_framework.php
http://salv.miscnotes.com/2008/01/net_framework_1.php
http://salv.miscnotes.com/2008/02/systemcolors.php


> そもそも、ストリームというのは読み進めると、なんでも読み戻ることができないのでしょうか?
元の位置に戻るためには、「読んだ情報をメモリに取っておく」か、「再度読み込みなおす」必要がありますよね。

MemoryStream のように、Byte 配列で持っている場合や、バイナリファイル等から得たストリームであれば、
ランダムアクセスに対応していますし、読み込みなおしもできますが、シーケンシャルデータはそうもいきません。
たとえば通信データの場合は、読み込みなおすとなると再通信が発生してしまう可能性があるからです。

元の位置に戻る必要が無いならば、読み終わったところから順に読み捨てていった方が効率が良いですよね。
(再読み込み無しで元に戻したいなら、読み終わったデータもメモリに蓄えねばなりません)


もし、Seek が使えないストリームの場合に、以前読み取ったデータを再参照したいのであれば、
読みとったデータを自分で保持しておくなどして対応してみてください。
引用返信 編集キー/
■14825 / inTopicNo.6)  Re[3]: VBでStreamの読み込み位置を戻す操作
□投稿者/ まどか (460回)-(2008/02/27(Wed) 14:45:43)
> ただ、まだ気になることがあるんです。ReadやReadByteで進めるという操作に対して戻す操作がないのが解せません。Seekは任意の位置を指定・・・。明らかにRead等に対になるものではないように思います。Seekというのは、詰まるところ・・・内部ではどういう操作になっているのでしょうか?

昔のレコードプレーヤーを思い浮かべてください。
#何それ?って世代だったらお手上げ(汗

読み込みという行為は原則先頭から最後へ向けての一方通行です。
Seekはレコード針を前(レコードの外側)へ戻すことです。
その間もレコードは同じ回転を同じ方向で続けています。

Dotさんが言われている戻す操作というのは、データが1,2,3だとしたら、"321"を一発で取得することでしょうか?
だとしたら、そのような手段や双方向で同じ意味を持つデータを少なくとも私は見た覚えがありません。
特に後者はそもそも"321"という形でデータを作りますし。
逆から読むという概念はあるとは思いますが、データとしては方向が決まっているということです。

#Readに対してDaerっていう命令を昔どっかで見たような気がするが。。。気のせいか。

Seekの内部の挙動ですが、バッファという概念がありますので
バッファ内におさまる場合は実質メモリ上でのポインタの移動だと思います。
バッファを越える場合は読みなおすということをしていると思います。

ストリームは、データを100%保持していなくても一部分をデータとして扱う概念です。
メモ帳は大きなファイルを開いたら全部読み終わるまで表示されません。
秀丸などのエディタでは大きなファイルでも一定のサイズを読み込んだらそこで表示され、残りも同じように表示の末尾に追加されていきます。
インターネットは物理的に遅いので大きな動画などはストリームを使い、読み込みの最後まで待たずに見ることができます。
引用返信 編集キー/
■14826 / inTopicNo.7)  Re[4]: VBでStreamの読み込み位置を戻す操作
□投稿者/ まどか (461回)-(2008/02/27(Wed) 14:47:42)
No14821 (Hongliang さん) に返信
> ファイルなんかはデータ元が全て手元にあるからシークできるでしょうが、データ元がネットワークの先とかだと聞きに戻ることができないってのは予想が付きませんか。

これはぼくも痛いところを突かれたって感じ。>普段忘れてる。
引用返信 編集キー/
■14827 / inTopicNo.8)  Re[4]: VBでStreamの読み込み位置を戻す操作
□投稿者/ Dot (4回)-(2008/02/27(Wed) 14:51:30)
ご回答ありがとうございます。分かりやすく説明していただき本当にありがとうございます。

今回の質問は、Seekが使えない環境にあるというわけではなくて、純粋にどうしてできないのだろうかという疑問からきたもので、これがわかればストリームの仕組みを知る一助になるかなと期待してのことでした。

///
内部実装を見たい場合には、2008 を導入してみてください。
(たとえば MemoryStream だと、内部的には Byte の配列で保持しているようです)
///

そういえば、MSが色々欧州市場で責められて技術公開をどうのっていうのが新聞に載っていましたが、これのことかな。2008を導入してみることにします。

ご回答は、本当に分かりやすくためになるものでした。皆さんありがとうございました。また何かありましたらぜひよろしくお願いします。
引用返信 編集キー/
■14828 / inTopicNo.9)  Re[5]: VBでStreamの読み込み位置を戻す操作
□投稿者/ Dot (5回)-(2008/02/27(Wed) 14:53:34)
解決とさせていただきます。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -