I/O系统

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 均为枚举类型。

FileMode成员及说明
Append:打开现有文件并查找到文件尾,或创建新文件。
Create:指定操作系统应创建新文件。如果文件已存在,它将被改写。
CreateNew:指定操作系统应创建新文件。
Open:指定操作系统应打开现有文件。打开文件的能力取决于 FileAccess 所指定的值。
OpenOrCreate:指定操作系统应打开文件(如果文件存在);否则,应创建新文件。
Truncate:指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。

FileAccess 成员及说明
Read: 对文件的读访问。 可从文件中读取数据。 同 Write 组合即构成读写访问权。
Write : 文件的写访问。 可将数据写入文件。 同 Read 组合即构成读/写访问权。
ReadWrite: 对文件的读访问和写访问。 可从文件读取数据和将数据写入文件。


基于字符的文件I/O操作
一般来说,要执行基于字符的文件操作,必须把FileStream包装在StreamReader类或者StreamWriter类中。这样,这些类可以自动吧字节数据流转换为字符数据流,也可以把字符数据流自动转换为字节数据流。
写入文件内容字符串:
            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();

读取和写入二进制数据
BinaryReader和BinaryWriter是一个字节数据流的包装器,它可以处理对二进制数据的读取和写入。
使用二进制可以读取包含Int、double、或者short类型的数据文件。
            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操作内存字节数据流
使用MemoryStream 从数组中读取输入或者把输出写入一个数组,而不是直接对物理设备进行操作。
MemoryStream是一个Stream实现,它可以使用字节数组作为输入输出。
基于内存的数据流在变成环境中非常有用。例如:可以预先构造复杂的输出,将它存储在数组中冰灾需要时取出。该技术在GUI花凝重编程时尤其有用。灵位,也可以重定向一个标准数据流来读取数组。

  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);
            }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值