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():关闭流,流用完一定记得关闭。 */
/* *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
- C#中的流(一)
- C#中的反射(一)
- C#中的继承(一)
- C#中的继承(一)
- C#中的文件操作 (一)
- C# 中的委托和事件(一)
- C#中的delegate 与event(一)
- C#中的线程(一)入门
- c#中的套接字编程(一)
- 浅谈c#中的泛型(一)
- C#中的线程(一)入门
- C#中的委托与事件(一)
- C# 中的委托和事件(一)
- c#中的内存管理(一)开篇
- C#中的线程(一)入门
- C#中的委托与事件(一)
- C#中的线程(一)入门
- C#中的线程(一)入门
- android升级到AppCompat v22.1.0后,onKeyDown 和 onKeyUp menu按键不能被触发的解决办法
- 对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例
- 2.6 数据类型转换
- 解密jQuery事件核心 - 委托设计(二)
- 中国三大石油公司信息化进展
- C#中的流(一)
- ORA-12520: TNS:listener could not find available handler
- git 下 分支创建 合并 删除 相关操作
- Objective-C继承
- 成绩排名
- 多线程 -- yield()方法和sleep()方法的区别
- 【学习笔记】JavaScript编码规范-类型
- 成绩管理系统
- 异常处理 Can't create handler inside thread that has not called Looper.prepare()