- - PR -
FileStremとTextWriter/Readerの使い分け(NetFramework)
1
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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してもかまわないのでしょうか? | ||||||||||||||||||||||||
|
投稿日時: 2003-07-27 13:20
ちょっとテストしてみました。
上記のようにWriterで書いた後でReaderで読み込んでも、 ファイルオープン時の内容が表示されてしまいます。 また、Writerで一定以上の書き込みを行うと、 Readerでの読み込みが出来なくなるようです。
書き込みサイズが1024を超えると、 Readerで読み込んでも読み込み時のファイル内容が表示されなくなります。 #バッファの設定の問題かも知れませんが・・・ ついでに、Writerを2つ作って書き込む例
フラッシュした順に書き込まれます。 基本的にWriterは単体で動かし、Readerが読み込んでいる間は、 ファイルの内容は変更不可にした方が安全そうです。
用途が違います。FileStreamはファイルに特化したストリームですが、 Reader/Writerは汎用的なストリームを相手にしています。 ファイルを意識する場合はFileStreamを使い、 単なるバイト列という扱いの場合はReader/Writerというように、 使い分けるといいと思います。 Streamの持っているメソッドとReader/Writerが持っているメソッドを比較すると、 用途の違いが見えると思います。
TextStreamとはVBのTextStreamオブジェクトの事でしょうか? これに関しては想像になってしまいますが、 Win32APIでもWin95OSR2以前は、2GByteまでのファイルしか扱えなかったように、 過去の名残ではないでしょうか? .NETのlongは64bitなので、今後の巨大なファイルに対応したのでしょう。 | ||||||||||||||||||||||||
|
投稿日時: 2003-07-27 21:05
うーん、どちらかというと、 Stream 系と Writer(および Reader)系で考えた方が良いのではないかと。 Stream系は、バイト列のストリームに対して読み書きを行う。 Writer(Reader)系は、オブジェクトや文字列という論理的な単位での読み書きを行う(エンコード、デコード等の機能を含む、というかそれを提供するのが目的?)。 Stream系の具象クラスは様々な物理的なStreamへのアクセスを提供するものや、Streamの読み書きに何らかの機能を追加するデコレータ的なものがありますが、いずれにしてもバイト列のストリームへのアクセスを抽象化するのが目的でしょう。 基本的には、バイト列としてのアクセスが必要であればStream系、テキストなどとしての書き込みが必要であればWriter系を使うというような考え型になると思います。 # 通常はパフォーマンスで使い分ける物ではないと思います。 | ||||||||||||||||||||||||
|
投稿日時: 2003-07-28 00:15
ご返答ありがとうございます。
各クラスの意図の違いを整理してくださりありがとうございます。 両者の使い分けが明確になりました。 また、実験までしてくださってありがとうございます。 |
1