C#的I/0依赖于数据流。
流共分为:字节数据流 ,字符数据流,二进制数据流
字节数据流
C#的核心数据流是System.IO.Stream。 Stream代表字节数据流,它是所有其他数据流的基类。Stream是抽象类。
从Stream派生出来的字节数据流类:
BufferedStream: 封装字节数据流并添加缓冲。缓冲可以在多种情况下改进性能。
FileStream: 针对文件系统的I/O设计的字节数据流
MemoryStream: 使用内存来存储的字节数据流
UnmanagedMemoryStream: 使用非托管内存来存储的字节数据流。
字符数据流
字符数据流层次结果的最顶层是抽象类TextReader和TextWriter。前者TextReader处理输入,而TextWriter处理输出。
TextReader类和TextWriter类由一些基于字符的数据流类实现。因此,这些数据流提供了TextReader和TextWriter指定的属性和方法。
StreamReader : 从字节数据流读取字符。该类封装了一个字节输入数据流。
StreamWriter: 把字符写入字节数据流。该类封装了一个字节输出数据流。
StringReader: 从字符串读取字符
StringWriter: 将字符写入字符串
二进制数据流
BinaryReader和BinaryWrite,它们能够直接读写二进制数据。
文件数据流和面向字节的文件I/O操作
C#提供了在文件中读写字节的方法,一种常用的方法是使用字节数据流来读写文件。要创建一个附加到文件的面向字节的数据流,可以使用FileStream类。
FileStream fin = new FileStream("text.txt", FileMode.Open, FileAccess.Read);
fin.ReadByte();
fin.Read(byte[] array,int offset,int count);
fin.Write(byte[] array,int offset,int count);
fin.WriteByte(byte value);
以上,分别为读取事件,和写入事件。
执行文件输出时,输出的内容通常不会立刻写入到真正的物理设备中。香氛,操作系统先把输出内容保存到缓冲区,然后一次性写入大量的数据。正中处理方法可以改进系统的性能。
在处理问文件之后,应当调用Close方法关闭它。
FileMode,FileAccess 均为枚举类型。
Write : 文件的写访问。 可将数据写入文件。 同 Read 组合即构成读/写访问权。
ReadWrite: 对文件的读访问和写访问。 可从文件读取数据和将数据写入文件。
FileStream fs = new FileStream("text.txt", FileMode.Open);
StreamWriter sw = new StreamWriter(fs);
sw.Write("abc");
sw.Close();
fs.Close();
StreamWriter sw2 = new StreamWriter("text.txt");
sw2.Write("efg");
sw2.Close();
读取文件内容字符串:
FileStream fs = new FileStream("text.txt", FileMode.Open);
StreamReader sw = new StreamReader(fs);
string a = sw.ReadToEnd();
sw.Close();
fs.Close();
StreamReader sw2 = new StreamReader("text.txt");
string b = sw2.ReadToEnd();
sw2.Close();
读取和写入二进制数据
FileStream fs = new FileStream("text.txt", FileMode.Open);
BinaryWriter bw = new BinaryWriter(fs);
int i = 1;
bw.Write(i);
bw.Close();
fs.Close();
FileStream fs2 = new FileStream("text.txt", FileMode.Open);
BinaryReader br = new BinaryReader(fs2);
int r = br.ReadInt32();
br.Close();
fs2.Close();
使用MemoryStream操作内存字节数据流
byte[] storage = new byte[255];
MemoryStream memstrm = new MemoryStream(storage);
StreamWriter memwtr = new StreamWriter(memstrm);
StreamReader memrdr = new StreamReader(memstrm);
for (int i = 0; i < 10; i++)
{
memwtr.Write("byte[" + i + "]:" + i+"\n");
}
memwtr.WriteLine(".");
memwtr.Flush();
Console.WriteLine("\nReading througn directly:");
foreach (char ch in storage)
{
if (ch == '.') break;
Console.Write(ch);
}
Console.WriteLine("\nReading througn memrdr:");
memstrm.Seek(0, SeekOrigin.Begin);
string str = memrdr.ReadLine();
while (str != null)
{
str = memrdr.ReadLine();
if (str.CompareTo(".") == 0) break;
Console.WriteLine(str);
}