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

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

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

Re[2]: テキストファイルの非同期読み込み


(過去ログ 31 を表示中)

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

■14965 / inTopicNo.1)  テキストファイルの非同期読み込み
  
□投稿者/ ヒジキ (8回)-(2008/02/29(Fri) 12:55:48)

分類:[.NET 全般] 

こんにちは。
以前質問して、とても分かりやすく解説していただきました。また質問させていただきます。

VB.NETでStreamクラスを利用してテキストの読み書きを行えるクラスを作っています。

テキストを非同期で読み込むメソッド(BeginRead)があったので利用してみました。読み込み自体はできました。

ただこのBeginReadって、ストリームのデータ(この表現はあってるのかな?)がバイト配列に格納されるのですが、そうすると、実際にデータを扱うためには、ストリーム⇒バイト配列⇒データ操作という順番になって、バイト配列部分のプロセスが非常に無駄な気がしてしようがないです。バイト配列に格納せず、ストリームのデータを非同期で直接取得する方法はないでしょうか?この場合の非同期はマルチスレッドじゃなくて、コールバックを使った方法が良いです(BeginReadでやりたいのです)。

例えばStreamクラスのReadメソッドなんかは、中身がどうなっているのかわからないですが(VS2008を入れれば分かるのかな・・・)、バイト配列にデータを入れないで、ストリームのデータを直接取得しているのではないでしょうか?

上のような方法に限定される環境にあるわけではなく、こういうことってできるのかな?と思い質問させていただきました。

よろしくお願いします。
引用返信 編集キー/
■14966 / inTopicNo.2)  Re[1]: テキストファイルの非同期読み込み
□投稿者/ Hongliang (249回)-(2008/02/29(Fri) 13:09:57)
> 例えばStreamクラスのReadメソッドなんかは、中身がどうなっているのかわからないですが(VS2008を入れれば分かるのかな・・・)、バイト配列にデータを入れないで、ストリームのデータを直接取得しているのではないでしょうか?
や、Stream.Read は渡した byte[] にデータを格納してもらうメソッドですが。
同期と非同期では byte[] に格納されるタイミングが変わるだけですよ。
引用返信 編集キー/
■14967 / inTopicNo.3)  Re[1]: テキストファイルの非同期読み込み
□投稿者/ シャノン (306回)-(2008/02/29(Fri) 13:23:18)
No14965 (ヒジキ さん) に返信

# 論点を間違えていたらごめんなさい。

例えば、テキストファイルの中身って何だかご存知ですか?
ここで「文字列」と答えるのは、間違いとは言わないまでも、十分な回答ではありません。

文字列は文字の集まりであって、文字は文字コードという数値によって表されます。
つまり、テキストファイルの中身は数値の集まりです、とも言えます。
ですから、文字列を書き込んだテキストファイルを、数値データとして読むこともできます(読み込んだデータにどんな意味があるかは別として)。
ファイルに書き込まれているのは「文字コード値を表すバイト列」に過ぎません。
より正確には「文字コード値とも解釈できるバイト列」です。

要するに、何が言いたいのかというと、テキストファイルであれ Excel のファイルであれ Exe ファイルであれ、中身はどれもバイトデータである、ということです。
そのバイトデータを、文字列として解釈するのか、数値として解釈するのか、それ以外の何らかのデータとして解釈するのか、それは、データを読み込むアプリケーションが決めることであって、データが決めることではありません。

> 例えばStreamクラスのReadメソッドなんかは、(中略)バイト配列にデータを入れないで、ストリームのデータを直接取得しているのではないでしょうか?

というのは、テキストファイルであれば、Stream クラスはテキストファイルから文字列を読み取って、それをバイト配列に加工して返している、と思われているということでしょうか。
だとしたら逆で、ファイルから読み込んだそのままの形がバイト配列であって、それを加工した形が文字列なのです。
引用返信 編集キー/
■14972 / inTopicNo.4)  Re[2]: テキストファイルの非同期読み込み
□投稿者/ れい (431回)-(2008/02/29(Fri) 15:55:17)
データは全部バイト列で表現せざるを得ないので、
シャノンさんの言うように、
発想の順番が違うのですが…。

#なんか感動しました。
#すべて抽象化して考えているのですね。
#バイト列も、自分で使うデータ型も。
#仕組みがよくわかってない質問は、説明が大変になるので
#基礎から勉強してくださいと投げてしまうのが常ですが、
#ナンセンスといって切ってしまにはもったいない鋭さを感じました。

たぶん、EndReadしたときに
String型とかInteger型とか自分で作ったデータ型を取得したいということだと思います。

そうなのだとすると、
それはバイト列から逐次変換するのが一般的です。

データは全部バイト列でどう解釈するかはプログラム次第なので、
Integerの配列を返すBeginReadを作ることもできますが、
全ての型について作るのは、それこそ無駄ですから。(というか、無理です。

バイト列にコピーされるのが無駄、というなら、
コピーを減らすためにAPIを使ったりドライバ叩いたりというのも理論上可能ですが、
利点が欠点を上回ることは殆どないでしょう。

EndReadするたびに変換するのが大変だとか、より抽象化したいのであれば、
自分で作るとよいです。
この辺はいくつかよく使われる戦略があります。

・必要なデータ型をReadできるストリームを作る。
内部にStreamのインスタンスを保持して、Readのたびに変換するようなクラスを作ればいいだけです。

・ジェネリックなStreamクラスを考える。
Stream(Of T)みたいなのを作ると再利用できます。
データ型Tにはバイト表現と相互に変換できるようなメソッドを用意してやればいいだけです。

・データ型とバイト列と、相互に変換するようなコンバータークラスを作る。

などなど。

それとも、EndReadしたあとのバイト列からデータへの変換まで非同期でやりたい、
というのでしょうか?
それは…、
いい加減投稿が長くなったので割愛です。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -