C#中的流(一)

来源:互联网 发布:php ruby perl python 编辑:程序博客网 时间:2024/06/09 18:44

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在编写本文前,首先要感谢http://www.cnblogs.com/JimmyZheng/category/356410.html作者,他的C#温故而知新系列给了我很大的启发,读者不妨去看看。</span>

1.流:关于流这个概念,我觉得马士兵老师讲的非常形象(顺便说一下,马士兵老师的JAVA视频教程非常经典,无论你是初学JAVA还是C#,他的视频都值得一看)。流是用来读写数据的,这个数据可能来自磁盘,也可能来自网络。数据好比一桶水,流好比一根管子,当我们打开一个文件读取数据时,就好比把管子插到桶里取水。

在.NET System.IO命名空间下,有以下几种流:

(1)Stream:字节流,这是一个抽象类,它的子类有FileStream, MemoryStream, BufferedStream等。

(2)TextReader/TextWriter:字符流,两个抽象类,子类有StreamReader/StreamWriter, 

(3)BinaryReader/BinaryWriter:二进制流。




2.Stream

/* *Stream:这是一个抽象类 *重要属性: *1.CanRead:是否可读 *2.CanSeek:是否支持查找 *3.CanWrite:是否可写 *4.Length:获取用字节表示的流长度 *5.Position:获取流的位置,这个属性有一些重要的用途 * * 重要方法: * 1.int Read(byte[]buffer,int offset,int count):将数据读取到buffer里,offset存储数据的起始偏移,count为最大读取的字节数。返回值为读取的字节数。 * 2.void Write(byte[]buffer,int offset,int count):将buffer里count个字节的数据复制到当前流,offset为起始偏移。 * 3.void Flush():当在派生类中重写时,将清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。有缓冲区的流在关闭前一定要Flush()一下。 * 4.long Seek(long offset,SeekOrigin origin):设置当前流中的位置。比如Seek(3,SeekOrigin.Current),设置流的位置到当前位置的三个字节后。 * 5.void Close():关闭流,流用完一定记得关闭。 */


3.FileStream:文件流:

/* *Stream:这是一个抽象类 *重要属性: *1.CanRead:是否可读 *2.CanSeek:是否支持查找 *3.CanWrite:是否可写 *4.Length:获取用字节表示的流长度 *5.Position:获取流的位置,这个属性有一些重要的用途 * * 重要方法: * 1.int Read(byte[]buffer,int offset,int count):将数据读取到buffer里,offset存储数据的起始偏移,count为最大读取的字节数。返回值为读取的字节数。 * 2.void Write(byte[]buffer,int offset,int count):将buffer里count个字节的数据复制到当前流,offset为起始偏移。 * 3.void Flush():当在派生类中重写时,将清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。有缓冲区的流在关闭前一定要Flush()一下。 * 4.long Seek(long offset,SeekOrigin origin):设置当前流中的位置。比如Seek(3,SeekOrigin.Current),设置流的位置到当前位置的三个字节后。 * 5.void Close():关闭流,流用完一定记得关闭。 *  *  * FileStream:文件流,文件的复制,剪切,粘贴,删除, 本地文件上传,下载,等许多操作都离不开文件流。 * 构造函数: * 1.FileStream(string path,FileMode):path为文件路径,FileMode是打开文件方式 * 2.FileStream(string parh,FileMode,FileAccess):FileAccess指定读写权限 * 3.FileStream(string path,FileMode,FileAccess,FileShare):FileShare指定文件共享状态,即是否允许其它程序操作文件 * 4.FileStream(string path,FileMode,FileAccess,FileShare,int bufferSize):bufferSize指定缓冲区大小 * 5.FileStream(string path,FileMode,FileAccess,FileShare,int bufferSize,bool useAsync):useAsync指定使用异步 I/O 还是同步 I/O。正确使用异步 I/O, * 可以使应用程序的速度加快 10 倍,但是如果在没有为异步 I/O 重新设计应用程序的情况下使用异步 I/O,则可能使性能降低 10 倍。 *  * 常用方法: * 1.BeginRead/EndRead:开始/结束异步读 * 2.BeginWrite/EndWrite:开始/结束异步写 * 3.Lock(long position,long length):锁住文件全部或部分。锁定一个文件的某个部分,使其他进程即使对该文件有读/写访问权限也无法访问该文件的这一部分。 * 4.Unlock(long position,long length):允许其他进程访问以前锁定的某个文件的全部或部分。 * 5.ReadByte()/WriteByte():读写单个字节 */using System;using System.Collections.Generic;using System.Text;using System.IO;namespace TestStream{    class Program    {        static void Main(string[] args)        {            string path=@"E:\Test.txt";            byte[] myFile = new byte[1000];            FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.None,30);//构建文件流            int count = (int)fileStream.Length;            fileStream.Seek(1, SeekOrigin.Begin);            using (fileStream)            {                int numReaded=0;                int numToRead=(int)fileStream.Length;//获取流的长度                while (true)                {                    int n=fileStream.Read(myFile, numReaded, count);                    if (n==0)                    {                        break;                    }                    else                    {                        numReaded += n;                        numToRead -= n;                    }                }                Console.WriteLine(fileStream.Position);                string str = Encoding.Default.GetString(myFile, 0, count);//Encoding这个类很强大,这里利用它来进行byte[]到string转换                Console.WriteLine(str);                fileStream.Seek(12, SeekOrigin.Begin);                fileStream.Write(myFile, 0, count);                fileStream.Flush();                fileStream.Close();            }        }    }}

4.BufferedStream:缓冲流

 BufferedStream:缓冲流:将缓冲层添加到另一个流上的读取和写入操作。可以增强流的读写性能。
 构造函数:
 缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。 缓冲区可提高读取和写入性能。 使用缓冲区可进行读取或写入,但不能同时进行这两种操作。 
 BufferedStream 的 Read 和 Write 方法自动维护缓冲区。
 1.BufferedStream(Stream):使用默认的缓冲区大小 4096 字节初始化
 2.BufferedStream(Stream,int):使用指定的的缓冲区大小初始化

0 0
原创粉丝点击