.NET一流与序列化>流

                      流的最主要用途就是与应用程序外部的文件或数据源进行数据交互

文件流: FilStream

        网络流:NetworkStream

       串口:SerialPort

       Web服务器:HttpRequest和HttRespone

      流帮助我们与文件及外围设备进行数据交流,因为流的主要用途是输入/输出,所以将它定义在了System.IO命名空间下。

      流与字节不同,流是一个动态的概念,按照字节的次序进行顺序访问,每次可以访问单个字节,也可以访问连续的一段字节。

   

  需要注意的是应用程序中用于保存临时数据的Byte[]数组。

         可以设置和文件同样大小的Byte[]数组,然后一次性的读取文件的全部字节,再将数据一次性的写入到新文件中。

         那么就有两个问题:

                       文件太大

                       不知道文件的大小,只有传输完才知道

         一般设置Byte数组为1kb,当下一次循环时临时数据就会被覆盖并丢弃,相当于一个临时缓存buffer。

 

使用流进行文件复制:

一次性复制:

         流到应用程序:
         Stream source = new FileStream(@"D:\headqq.bmp", FileMode.Open, FileAccess.Read);

         建立一个流对象。

         byte[] buffer = new byte[source.Length];

         文件流保存在应用程序的Byte[]数组中。

         int bytesRead = source.Read(buffer, 0, (int)source.Length);

 

         应用程序到文件

         Stream target = new FileStream(@"C:\headqq2.bmp", FileMode.Create, FileAccess.Write);

         target.Write(buffer, 0, buffer.Length);    target.Dispose();

         把buffer里面的数据全部的写到文件中。

 

循环分批复制:

   

int BufferSize = 10240;// 10 KB
Stream source = new FileStream(@"D:\Temp\CarelessWhisper.mp3", FileMode.Open,
FileAccess.Read);
Stream target = new FileStream(@"D:\CarelessWhisper.mp3", FileMode.Create,
FileAccess.Write);
byte[] buffer = new byte[BufferSize];
int bytesRead;
do {
bytesRead = source.Read(buffer, 0, BufferSize);
target.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
source.Dispose();
target.Dispose();

 

流的类型体系:

       基础流: Stream基类,定义了所有流都应该具有的行为 

                             从流中读取count字节数据,从流中读取一个字节。

                             向流中写入数据,CanWrite,是否可以写。

                             移动流指针,CanSeek

MemoryStream提供了一个以流的方式来处理Byte[]数组的方法,可以简单地认为MemoryStream使操作Byte[]数组的方式变得更加丰富。

Byte[] buffer = { 5, 4, 3, 2, 1 };
MemoryStream ms = new MemoryStream(buffer);
int rtn = ms.ReadByte();
Console.WriteLine(rtn); // 输出 5

      装饰器流:

                因为装饰器是基于Stream基类的,而不是特定的FileStream或 MemoryStream,因此它可以为所有的流增添功能。

                这些装饰器流并没有全部定义在System.IO命名空间下。DeflateStream和GZipStream位于System.IO.Compression,用于压缩和解压缩;CryptoStream位于System.Security.Cryptography,用于加密解密;AuthenticatedStream位于System.Net.Security,用于安全性。只有BufferedStream位于System.IO下,用于增强缓存。在本书第9“.NET中的加密和解密将会介绍CryptoStream

      包装器流:
                 那么要如何读取文件内容呢?和流相关的一组包装器类提供了这个服务,它可以方便地协助开发者处理流所包含的数据,并且不需要将流转存为Byte[]数组的形式。

                1StreamReaderStreamWriter

                           StreamReader继承自TextReader,用于将流中的数据读取为字符。

                2BinaryReaderBinaryWriter

                           StreamReaderStreamWriter分别适用于读取和写入文本字符的场合,而BinaryReaderBinaryWriter的适用更广泛一些。BinaryWriter用于向流中以二进制方式写入基元类型,例如intfloatcharstring等; 

        

     帮助类: 

      打开文件也是一样,File提供了Openstring path,FileMode mode)、OpenRead()OpenWrite()几个方法,从方法名就可以推测出方法的用途。除此以外,File还提供了其他一 些快速操作的方法,例如ReadAllText()以文本方式读取文件的全部内容,ReadeAllByte()字节方式读取文件全部内容。与读取相对应,File还提供了写入的方法,例如WriteAllBytes()WriteAllLines()等。而对于本章示例中的复制文件,只要调用File类中的 Copystring sourceFileName,string destFileName)方法,并且只需要一行代码就可以完 成。建议大家自己动手试一试。

     可见,对于文件,大家几乎用不着手动创建FileStreamStreamReader/StreamWriter,应该优先考虑使用File静态类中的快速方法。

 

 

 

                

 

 

 

 

 

    

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值