- PR -

FileStremとTextWriter/Readerの使い分け(NetFramework)

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2003-07-25 23:58
1つのファイルに対して読み書きするとして、読み込み位置と書き込み位置を
独立で管理したいことがあります。そのような場合、1つのFileStreamに対して
TextWriterとTextReaderを定義することは適切な方法でしょうか?

FileStreamを直接操作する場合よりTextWriter/TextReaderを使うのとで
負荷や応答速度に大きな違いが発生することがあるのでしょうか?
両者を意識して使い分ける必要はあるのでしょうか?

FileStreamのSeekのPositionがlong型なのに対してTextStreamのSeekのPositionが
int型になっているのは深い意味があるのでしょうか?

1つのファイルに対して複数のTextWriter/TextReaderを定義する場合、
同一時刻に1つのTextWrite/TextReaderしかアクセスしないことを
保障すれば複数を同時にOpenしてもかまわないのでしょうか?
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-07-27 13:20
引用:

伊藤さんの書き込み (2003-07-25 23:58) より:
1つのファイルに対して読み書きするとして、読み込み位置と書き込み位置を
独立で管理したいことがあります。そのような場合、1つのFileStreamに対して
TextWriterとTextReaderを定義することは適切な方法でしょうか?



ちょっとテストしてみました。
コード:
	fs = File.Open("hoge.txt", FileMode.Open);
	StreamReader sr = new StreamReader(fs);
	StreamWriter sw = new StreamWriter(fs);
	sw.WriteLine("ABC");
	sw.Flush();
	Console.WriteLine(sr.ReadToEnd());


上記のようにWriterで書いた後でReaderで読み込んでも、
ファイルオープン時の内容が表示されてしまいます。

また、Writerで一定以上の書き込みを行うと、
Readerでの読み込みが出来なくなるようです。
コード:
	fs = File.Open("hoge.txt", FileMode.Open);
	StreamReader sr = new StreamReader(fs);
	StreamWriter sw = new StreamWriter(fs);
	for (int i = 0; i < 1025; ++i) {
		sw.Write("A");
	}
	Console.WriteLine(sr.ReadToEnd());


書き込みサイズが1024を超えると、
Readerで読み込んでも読み込み時のファイル内容が表示されなくなります。
#バッファの設定の問題かも知れませんが・・・

ついでに、Writerを2つ作って書き込む例
コード:
	StreamWriter sw1 = new StreamWriter(fs);
	StreamWriter sw2 = new StreamWriter(fs);

	sw1.WriteLine("ABC");
	sw2.WriteLine("XYZ");
	sw2.Flush();
	sw1.Flush();

/* 結果
XYZ
ABC
*/


フラッシュした順に書き込まれます。

基本的にWriterは単体で動かし、Readerが読み込んでいる間は、
ファイルの内容は変更不可にした方が安全そうです。

引用:

FileStreamを直接操作する場合よりTextWriter/TextReaderを使うのとで
負荷や応答速度に大きな違いが発生することがあるのでしょうか?
両者を意識して使い分ける必要はあるのでしょうか?


用途が違います。FileStreamはファイルに特化したストリームですが、
Reader/Writerは汎用的なストリームを相手にしています。
ファイルを意識する場合はFileStreamを使い、
単なるバイト列という扱いの場合はReader/Writerというように、
使い分けるといいと思います。

Streamの持っているメソッドとReader/Writerが持っているメソッドを比較すると、
用途の違いが見えると思います。

引用:

FileStreamのSeekのPositionがlong型なのに対してTextStreamのSeekのPositionが
int型になっているのは深い意味があるのでしょうか?


TextStreamとはVBのTextStreamオブジェクトの事でしょうか?
これに関しては想像になってしまいますが、
Win32APIでもWin95OSR2以前は、2GByteまでのファイルしか扱えなかったように、
過去の名残ではないでしょうか?
.NETのlongは64bitなので、今後の巨大なファイルに対応したのでしょう。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-27 21:05
引用:

引用:

FileStreamを直接操作する場合よりTextWriter/TextReaderを使うのとで
負荷や応答速度に大きな違いが発生することがあるのでしょうか?
両者を意識して使い分ける必要はあるのでしょうか?


用途が違います。FileStreamはファイルに特化したストリームですが、
Reader/Writerは汎用的なストリームを相手にしています。


うーん、どちらかというと、
Stream 系と Writer(および Reader)系で考えた方が良いのではないかと。

Stream系は、バイト列のストリームに対して読み書きを行う。
Writer(Reader)系は、オブジェクトや文字列という論理的な単位での読み書きを行う(エンコード、デコード等の機能を含む、というかそれを提供するのが目的?)。

Stream系の具象クラスは様々な物理的なStreamへのアクセスを提供するものや、Streamの読み書きに何らかの機能を追加するデコレータ的なものがありますが、いずれにしてもバイト列のストリームへのアクセスを抽象化するのが目的でしょう。

基本的には、バイト列としてのアクセスが必要であればStream系、テキストなどとしての書き込みが必要であればWriter系を使うというような考え型になると思います。
# 通常はパフォーマンスで使い分ける物ではないと思います。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2003-07-28 00:15
ご返答ありがとうございます。
各クラスの意図の違いを整理してくださりありがとうございます。
両者の使い分けが明確になりました。
また、実験までしてくださってありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)