博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net System.IO.Stream 流操作类(FileStream等)
阅读量:4924 次
发布时间:2019-06-11

本文共 3697 字,大约阅读时间需要 12 分钟。

Stream 是所有流的抽象基类。流是字节序列的抽象概念。

 

流涉及到的3个基本操作:

  读取流,读取是指从流到数据结构(如字节数组)的数据传输。

  写入流,写入是指从数据结构到流的数据传输。

  流查找,查找是对流内的当前位置进行的查询和修改。

 

常用的Stream的子类有:

  1) MemoryStream 存储在内存中的字节流

  2) FileStream  存储在文件系统的字节流

  3) NetworkStream 通过网络设备读写的字节流

  4) BufferedStream 为其他流提供缓冲的流

 

文件流FileStream类

   FileStream类继承自Stream类,一个FileStream实例,代表一个文件流,用于对磁盘文件进行读取、写入、打开、关闭等操作。.net提供了多种获取FileStream对象的方法,其中构造函数就有十余种,下面我们来看一下典型的构造函数及其参数的解释:

public FileStream(string path, FileMode mode, FileAccess access);

参数说明:

  1)path:指明文件所在的路径信息;

  2)mode:FileMode的枚举值,表示文件打开或创建的方式,含义如下:
      CreateNew:指定操作系统应创建新文件,如果文件已经存在,则引发IOException;
      Create:指定操作系统应创建新文件,如果文件已经存在,它将被覆盖;
      Open:指定操作系统应打开现有文件,如果文件不存在,则引发FileNotFoundException;

      OpenOrCreate:指定操作系统应打开文件,如果文件不存在,则创建新文件;

      Truncate:指定操作系统应打开现有文件,文件一旦打开,就将截断为零字节大小;

      Append:打开先有文件并把Position设置至文件尾,如果文件不存在将创建新文件。Append只能同FileAccess.Write一起使用;
  3)access是FileAccess的枚举值,它控制对文件的访问权限,含义如下:

      Read:打开文件用于只读;

      Write:打开文件用于只写;
      ReadWrite:打开文件,用于读写;

 

  除了FileStream类本身提供的构造函数外,System.IO命名空间下的File和FileInfo类也提供了创建FileStream对象的方法。其中OpenRead方法返回只读文件流,OpenWrite方法返回只写文件流。如:

FileStream fs=File.OpenRead(@"c:\file.txt");

 FileStream的读写方法签名:

public override int Read(    byte[] array,    //内存缓冲区,储存从文件流中读取的数据    int offset,     //偏移量,array开始写入数据的下标值    int count      //从文件流中读取的字节大小);public override void Write(    byte[] array,  //内存缓冲区,存储了要写入流的字节数据    int offset,   // 从array的下标值开始取数据    int count    //要写入的字节数);

 

使用示例:

try{  //写入  FileStream fileStream = new FileStream(@"d:\test.txt", FileMode.OpenOrCreate);  byte[] content = Encoding.UTF8.GetBytes("我爱我家");  fileStream.Write(content, 0, content.Length);  fileStream.Position = 0; //设置当前位置  content = Encoding.UTF8.GetBytes("我爱你家");   fileStream.Write(content, 0, content.Length);  fileStream.Close();   //读取  fileStream = new FileStream(@"d:\test.txt", FileMode.Open);  content = new byte[fileStream.Length];  fileStream.Read(content, 0, content.Length);  Console.WriteLine(Encoding.UTF8.GetString(content));}catch (Exception ex){  Console.WriteLine(ex.Message);}

 

内存流 MemoryStream

  和文件流不同,MemoryStream类表示的是保存在内存中的数据流,由内存流封装的数据可以在内存中直接访问。内存一般用于暂时缓存数据以降低应用程序对临时缓冲区和临时文件的需要。

  既然字节数据也在内存中存储,为什么还要引入内存流的概念呢?这是因为内存流和字节数组虽然都位于程序缓冲区,但是具有不同特性。内存流相对于字节数组而言,具有流特有的特性,并且容量可自动增长,在数据加密以及对长度不定的数据进行缓存等场合,使用内存流比较方便。

MemoryStream有多种构造函数,部分举例如下:

  • public MemoryStream();该构造函数初始分配的容量大小为0,随着数据的不断写入,其容量可以不断地自动扩展。
  • public MemoryStream(byte[] buffer);根据字节数组buffer初始化,实例的容量大小规定为字节数组的长度。
  • public MemoryStream(int capacity);容量固定为capacity。

MemoryStream实例

MemoryStream mem = new MemoryStream();Console.WriteLine("初始分配的容量:"+mem.Capacity+" 初始使用量:"+mem.Length);byte[] content = Encoding.UTF8.GetBytes("我爱我家");mem.Write(content, 0, content.Length);Console.WriteLine("初始分配的容量:" + mem.Capacity + " 初始使用量:" + mem.Length);

 

网络流NetWorkStream

  网络流的意思是数据在网络的各个位置之间是以连续的字节形式传输的,NetWorkStream只能用于面向连接的套接字。

对于NetWorkStream流,写入操作是指从来源端内存缓冲区到网络上的数据传输;读取操作是从网络上到接收端内存缓冲区的数据传输。

如需对NetWorkStream深入了解,请查阅相关资料。

 

参考:

  http://www.cnblogs.com/gavin-num1/p/5190312.html

 

 

其它相关:

1)从文件读取文本

通过使用  或  方法也可以实现此功能。

using System;using System.IO;public class TextFromFile {    private const string FILE_NAME = "MyFile.txt";    public static void Main(String[] args)     {        if (!File.Exists(FILE_NAME))         {            Console.WriteLine("{0} does not exist.", FILE_NAME);            return;        }        using (StreamReader sr = File.OpenText(FILE_NAME))        {            String input;            while ((input=sr.ReadLine())!=null)             {                Console.WriteLine(input);            }            Console.WriteLine ("The end of the stream has been reached.");            sr.Close();        }    }

 

转载于:https://www.cnblogs.com/ybtools/p/6423327.html

你可能感兴趣的文章
HTMLParser-简单HTML和XHTML解析
查看>>
Java_基础_关键字_volatile
查看>>
American Heritage usaco
查看>>
BZOJ 3689 异或之
查看>>
sublime运行错误
查看>>
vue中渲染页面,动态设置颜色
查看>>
理清cordova插件的调用流程
查看>>
【20170926】【软工】第一次个人项目——数独
查看>>
【poj1741 Tree】
查看>>
如何控制oracle RAC 进行并行运算
查看>>
学习总结-封装、继承、多态。
查看>>
c++程序设计原理与实践 第四章部分答案
查看>>
面向对象目的选层电梯作业总结
查看>>
Tensorflow图像处理
查看>>
版本号的意义
查看>>
Java基础学习总结——Java对象的序列化和反序列化
查看>>
java运算符
查看>>
Poj3468 A Simple Problem with Integers (分块)
查看>>
级联保存
查看>>
Python自学知识点----Day02
查看>>