学习NetにおけるI/Oの心得---第一編I/Oを探る

9831 ワード

第一篇初探I/O
完全な意味でのプログラムには、必ずデータの処理が含まれています.これには、一部のユーザーの入力、データファイルへのアクセスなどが含まれます.そのため,プログラムにおける入出力技術が特に重要である.
C/C++から来たプログラマーにとって、ファイルの入出力は非常に面倒なことです.I/Oにキャッシュ技術を用いても,入出力はコードの複雑さにかかわらず,プログラムの実行速度にかかわらず,プログラマーを悩ませることである.
Javaが登場してから、この問題はずっと簡単になったようです.Sun社はJavaの設計にデコレーションモードを用いてI/Oを設計している.プログラマは,オブジェクト向けの特性により,自分のI/Oコードに必要な機能を容易に持たせることができる.しかし、この中で不足しているのはJavaのI/Oパッケージjavaです.ioの設計はUnix/Linuxシステムに基づいてファイルの管理方式を設計している(Unix/Linuxではデータファイル、ディレクトリ、ハードウェアデバイスにかかわらずファイル形式で管理されており、ファイル形式全体に1つのルート'/'ディレクトリしかない.この管理方式は管理の複雑さと難易度をある程度大幅に低減している).Windowsのファイル管理モードを熟知しているプログラマーにとって、これは非常に不便です.
今、います.NetプラットフォームにはJavaのようなI/Oライブラリも用意されています.特に.Net 2.0ライブラリはI/Oを変更する.Net I/OはJavaをパクリした影から出てきます.
次に見てみましょう.NetのI/Oライブラリ:
1、I/Oライブラリの基本アーキテクチャ
(1)において.NetにI/Oライブラリがmscorlibに格納.dllファイルでは、ネーミングスペースはSystemです.IO.5つの基本的な抽象クラス、さらにはそれぞれ
Stream:I/Oのフロー操作を担当します.Net I/Oのコアクラス.基本的にすべてのI/O操作は欠かせません.
TextReaderとTextWriter:文字テキスト操作の抽象クラスを提供します.
FileSystemInfo:これは.Net 2.0でJavaとは異なるクラス.Windowsオペレーティングシステムの一般的な意味でのファイル情報だけでなく、ディレクトリなども含むファイル情報の管理を主に担当しています.これにより、ファイル情報の操作がさらに強化されます.
IOException:I/OライブラリでI/O異常を処理するクラスです.
(2)、その基本的な継承関係をご紹介します
a)、ファイル操作フロークラスStream:
継承図:Stream
FileStream(一般ファイルフロー)
BufferedStream(キャッシュされたファイルストリームは、本人が強くお勧めします.)
MemoryStream(メモリ領域の管理フローの操作)
UnmanagedMemoryStream(メモリ領域の非管理ストリームの操作)
b)、テキストクラスTextReaderとTextWriter:
継承図:TextReader
StreamReader(テキストファイルストリーム読み込み操作クラス)
StringReader
       TextWriter
StreamWriter(テキストファイルストリーミング操作クラス)
StringWriter(StringBuilderタイプをファイルで書くクラス)
c)、異常類IOException:
継承図:IOException
DirectoryNotFoundException(フォルダに異常は見つかりません)
DriveNotFoundException(ドライブに異常は見つかりません)
EndOfStreamException(ストリーム終了異常)
FileLoadException(ファイルロード異常)
FileNotFoundException(ファイルに異常は見つかりません)
PathTooLongException(パスが長すぎる異常)
d)、ファイル情報類FileSystemInfo:
継承図:FileSystemInfo
FileInfo(ファイル情報クラス)
Directory Info(ディレクトリ情報クラス)
e)、その他のクラス:
ファイルストリーム(Stream)をバイナリ操作するクラスであるBinaryReaderとBinaryWriter.Objectクラスに直接継承されますが、使用するときはストリームを使用してファイルを開く必要があります.
Fileクラスは、ファイルを操作するクラスで、多くの有用な静的メソッドを提供します.これはメソッドクラスです.
Directoryクラスは、ディレクトリの下のファイルの取得、ディレクトリの新規作成、ディレクトリの削除など、ディレクトリを操作するクラスです.
Pathクラス、パスを操作します.
DriveInfoクラスです.このクラスはInfoで命名されていますが、FileSystemInfoから継承されているわけではありません.このクラスもWindowsの特色クラスです.Monoを使用するLinuxプラットフォーム上で実行する.Netプログラムは、意味を失います.ドライブのサイズ、空きスペース、ボリュームラベル、フォーマットなどを取得する主な機能です.
(3)、ファイル操作に関する4つの基本抽象クラスのベースクラスMarshalByRefObject
これは、エージェントを使用してメッセージを交換することによって、I/O操作をアプリケーションドメインの境界にわたって通信するオブジェクトのベースクラスです.
以下はMSDNでこのクラスについて説明します.
アプリケーションドメインは、オペレーティングシステムプロセスの1つ以上のアプリケーションが存在するパーティションです。同じアプリケーションドメイン内のオブジェクトが直接通信します。異なるアプリケーションドメイン内のオブジェクトの通信方式には、アプリケーションドメインの境界にわたってオブジェクトのコピーを転送する方法と、プロキシを使用してメッセージを交換する方法の2つがあります。
MarshalByRefObjectは、エージェントを使用してメッセージを交換することによってアプリケーションドメインの境界にわたって通信するオブジェクトのベースクラスです.MarshalByRefObjectから継承されたオブジェクトではなく、値に基づいて暗黙的に封入されます.リモート・アプリケーションが値に基づいてカプセル化されたオブジェクトを参照すると、そのオブジェクトのコピーがアプリケーション・ドメインの境界にわたって渡されます.
MarshalByRefObjectオブジェクトは、ローカルアプリケーションドメインの境界内で直接アクセスできます.リモートアプリケーションドメイン内のアプリケーションがMarshalByRefObjectに初めてアクセスすると、そのリモートアプリケーションにエージェントが渡されます.エージェントの後の呼び出しは、ローカルアプリケーションドメインに存在するオブジェクトに戻されます.
アプリケーションドメイン境界にまたがってタイプを使用する場合、タイプはMarshalByRefObjectから継承される必要があります.また、オブジェクトのメンバーは作成されたアプリケーションドメイン以外では使用できないため、オブジェクトのステータスをコピーすることはできません.
2、.Net I/Oで役立つ機能
これはI/Oについて詳しくは説明せず、いくつかの有用な機能だけを紹介します.
(1)、テキストファイルを取得するすべての行
Fileクラスには、テキストファイル内のすべてのローを取り出す方法ReadAllLines(String path,Encoding encoding)があります.
(2)、文字列形式でテキストファイルの内容を取得するReadAllText(String path,Encoding encoding)
(3)、ファイルの内容をバイト配列で取得するReadAllBytes(String path)
(4)、以上の操作の書き込み操作
WriteAllBytes ( string path, byte [] bytes);
WriteAllLines ( string path, string [] contents, Encoding encoding);
WriteAllText ( string path, string contents, Encoding encoding);
(5)ファイルへのテキストの追加
        AppendAllText ( string path, string contents, Encoding encoding);
(6)あるパスの下にあるすべてのディレクトリを取得する
        GetDirectories(string path, string searchPattern, SearchOption searchOption);

(7)あるパスの下にあるすべてのファイルを取得する
        GetFiles(string path, string searchPattern, SearchOption searchOption);

はい.Netではプログラマーに便利なI/Oメソッドがたくさん用意されており、時間があればFile、Directory、DriveInfoをよく研究することができ、他の収穫があります.