A bináris fájlok egy speciális csoportja a szöveges fájlok. A szöveges fájlok csak olyan karaktereket tartalmaznak, amelyek nyomtathatóak, vagy a szöveg szervezését (új sor, tab, stb..) segítik.
Az ilyen fájlok kezelésére szolgálnak a StreamReader és StreamWriter osztályok. Létezik külön TextReader és TextWriter típus is, azonban ezek absztrakt osztályok, amelyeket külön nem lehet példányosítani. Ezek az ősosztályai a szöveges reader és writer osztályoknak. A többesszám itt azért indokolt, mert létezik StringReader és StringWriter osztály is. Ezekkel egy egybefüggő string változót kezelhetünk úgy, mint egy nagy szöveges Stream-et.
Használatukra nézzünk egy példát:
using System;
using System.IO;
using System.Text;
namespace PeldaSzovegesFajlkezeles
{
class Program
{
static void Main(string[] args)
{
using (MemoryStream teszt = new MemoryStream())
{
using (StreamWriter iro = new StreamWriter(teszt, Encoding.UTF8, 1024, true))
{
iro.WriteLine("Ez egy sor amit beírunk");
iro.WriteLine("Ez meg egy másik sor");
iro.WriteLine("Ez meg a harmadik");
}
//visszaállunk a stream elejére
//az írás után a végén vagyunk
Console.WriteLine("Olvasás után: ");
teszt.Seek(0, SeekOrigin.Begin);
using (StreamReader olvaso = new StreamReader(teszt, Encoding.UTF8, false, 1024, true))
{
string sor = null;
while ((sor = olvaso.ReadLine()) != null)
{
Console.WriteLine(sor);
}
}
}
Console.ReadKey();
}
}
}
A program kimenete:
Olvasás után:
Ez egy sor amit beírunk
Ez meg egy másik sor
Ez meg a harmadik
A programban itt is a StreamWriter és a StreamReader példányosítása érdekes. A writer osztály első paramétere itt is a cél stream, amibe írunk. A második paraméter felismerhetően a karakterkódolás. A harmadik paraméter a buffer méretet befolyásolja, a negyedik paraméter pedig arra ad utasítást, hogy az írás végén az alatta lévő stream (jelen esetben a teszt változó) ne legyen eltakarítva.
A reader esetén az első két paraméter egyértelmű. Az ezt követő false arra utasítja az olvasó objektumot, hogy ne próbáljon okoskodni a karakterkódolásban, az tényleg UTF8 lesz. Ezt követi a buffer méret megadás és szintén egy logikai érték, ami arra utasítja az olvasó objektumot, hogy az alatta lévő stream-et ne zárja be.
Abban az esetben, ha fájlból olvasnánk vagy írnánk, akkor a StreamWriter és a StreamReader példányosítása esetén elég lenne egy vagy két paramétert megadnunk. A bonyolult konstruktor hívásokra jelen példában a MemoryStream miatt volt szükség.