DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ストリームの読み書きについて

環境/言語:[.NET Framework 1.1 C#]
分類:[.NET]

初めまして。
ストリームについて、いろいろとやっていたのですが、詰まってしまい、解決できないため質問します。

ストリームを読み書きしようと思い、StreamReader、StreamWriter の実験をしていて以下のようなコードを書きました。


書いたコード(抜粋)

using System;
using System.IO;
using System.Text;


MemoryStream stream = new MemoryStream();

StreamWriter writer = new StreamWriter(stream);
StreamReader reader = new StreamReader(stream);

writer.WriteLine("めがっさにょろ");
writer.Flush();

Console.WriteLine("reader : " + reader.ReadLine());
Console.WriteLine("stream : " + Encoding.UTF8.GetString(stream.ToArray()));


やりたい事としては、StreamWriter.WriteLine した文字列をそのまま、ReadLine で読み出して画面に出力したいのですが、なぜか、ReadLine が null を返してしまいます。
stream の中にデータはあるようなのですが…。

何が悪いのか、まるで検討がつきません。

どなたが分る方、ご教授願います。
ストリームには位置という概念があります。
ストリームに書いていけば位置は一番後ろになります。
で、そのストリームをそのまま読もうとすると、さっき書き終わった一番後ろの位置から読もうということになります。当然データはありません。
Stream / MemoryStream のプロパティをご覧ください。位置を意味するのがあります。
■No16772に返信(Hongliangさんの記事)
> Stream / MemoryStream のプロパティをご覧ください。位置を意味するのがあります。

なるほど。
stream.Position でしょうか。

自分の頭の中では、読み込み位置と書き込み位置は別々にあるような感覚で考えて書いていました。

では、読み込み位置と書き込み位置を別々で、同じストリームを同時に読み書きできたりしないのでしょうか?
JavaでいうPipedInputStream、PipedOutputStreamのような?
(リングバッファ??)

調べた限りでは見当たらなかった気がします。
Stream が本で、StreamWriter/Reader はページをめくる人です(Writer はペンも持ってますが)。
「同じ本」を一人は書こうとし一人は読もうとしてる状況を考えてください。

> では、読み込み位置と書き込み位置を別々で、同じストリームを同時に読み書きできたりしないのでしょうか?

そう言うクラスを作れば可能でしょう。StreamReaader/StreamWriter を継承して、Read/Write 系メソッドをオーバーライドして呼ばれるたびに Position を自分が管理する位置に設定>読み書き>Position を元の位置に戻す、とか。
正直汎用的に使いでがあるとは思わないので別に標準じゃなくて良いですね。
よく分かりました。
標準ライブラリに無く、かつ汎用性も無い…ということは、一般的な方は必要としていないわけで、
自分が考えているアルゴリズムを見直して、本当にリングバッファのようなクラスが必要かどうか考え直してみます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板