ファイルやメモリ内容の読み書き (Stream, Reader, Writer)


概念

ファイルなどからの入出力を「ストリーム」と呼び、「リーダー」で読み込み、「ライター」で書き込む。

  • Stream : 入出力
  • Reader : ストリームの読み込み
  • Writer : ストリームの書き込み

Stream

ファイルの場合は FileStream、メモリの場合は MemoryStream を使う。

Stream
 ┣ BufferedStream
 ┣ FileStream
 ┗ MemoryStream

Reader

ファイルの場合は StreamReader、文字列の場合は StringReader を使う。

TextReader
 ┣ StreamReader
 ┗ StringReader
BinaryReader
XmlReader

Writer

ファイルの場合は StreamWriter、文字列の場合は StringWriter を使う。

TextWriter
 ┣ StreamWriter
 ┗ StringWriter
BinaryWriter
XmlWriter

使用例

CSV 形式のテキストを解析

CSV 形式とは、

  • 各フィールドをカンマで区切る
  • 各フィールドを二重引用符で囲む (囲まなくても良いが、カンマが含まれる場合は必須)
  • 二重引用符の場合は2つ続ける
using Microsoft.VisualBasic.FileIO; // Microsoft.VisualBasic.dll

var text = "abc,\"d\"\"ef\",\"gh,i\",jk";

using (var reader = new StringReader(text))
using (var parser = new TextFieldParser(reader) { TextFieldType = FieldType.Delimited, Delimiters = new[] { "," } })
{
    var fields = parser.ReadFields(); // ⇒ string[] { "abc", "d\"ef", "gh,i", "jk" }
}

XML をメモリ上で XSL 変換してファイルに出力

XSLT とは、XML を異なる XML 形式などに変換するもので、ここでの説明は割愛

// カスタムクラスとそのインスタンスを用意
class Class1
{
    public string Dummy { get; set; }
}
var obj = new Class1();

// XSL ファイルを読み込む
var xslt = new XslCompiledTransform();
xslt.Load("test.xsl", new XsltSettings(true, true), null);

using (var memory = new MemoryStream())
{
    // カスタムクラスの内容を XML としてメモリに書き込む
    using (var writer = XmlWriter.Create(memory, new XmlWriterSettings() { Encoding = Encoding.UTF8, Indent = true }))
    {
        var serializer = new XmlSerializer(obj.GetType());
        serializer.Serialize(writer, obj, new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }));
    }
    // メモリ内の XML を XSL 変換してファイルに出力
    using (var stream = new FileStream("sample.xml", FileMode.Create))
    {
        memory.Position = 0;
        xsl.Transform(memory, stream, Encoding.UTF8);
    }
}