• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#&&Stream

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

System.IO 提供了一个抽象类Stream , Stream类 支持对字节的读写操作。

  Stream是抽象类,所有其它流的类都必须从Steam类中继承。Stream类及其子类共同构成了一个数据源和数据存储的视图

  Stream类继承层级关系:

  

 

流包含以下基本操作:

读操作(Reading)。即读出流中的数据,把数据存放在另一种数据结构中,比如数组。

写操作(Writting)。即从另一种数据结构中读出数据,存放至流对象中。

搜索操作(Seeking)。即从流中的当前位置开始搜索,定位到指定的位置。

   由于数据类型的不同,一些流可能不同时支持以上的所有操作。比如网络流就不支持搜索操作。Stream类提供了CanRead,CanWrite和CanSeek三种属性,来表示流是否支持这些操作。

BinaryReader和BinaryWriter

BinaryReader和BinaryWriter这两个类提供了从字符串或原始数据到各种流之间的读写操作。

File和Directory

File类支持对文件的基本操作,包括创建、拷贝、移动、删除和打开一个文件。

Directory类则用于执行常见的各种目录操作,如创建、移动、浏览目录及其子目录。

File类和Directory类的基类都是抽象类FileSystemEntry。

TextReader和TextWriter

TextReader和TextWriter类都是抽象类。和Stream类的字节形式的输入和输出不同,它们用于Unicode字符的输入和输出。

StringReader和StringWriter

StringReader和StringWriter在字符串中读写字符。

StreamReader和StreamWriter

StreamReader和StreamWriter在流中读写字符。

BufferedStream

BufferedStream是为网络流添加缓冲的一种流类型,利用缓冲可以避免操作系统频繁地到磁盘上读取数据,从而减轻了操作系统的负担。

MemoryStream

MemoryStream是一个无缓冲流,它所封装的数据直接放在内存中,因此可以用于快速临时存储、进程间传递信息等。

NetworkSteam

Networksteam表示在互联网络上传递的流。

示例:

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 

namespace ConsoleApplication9
{
  class Program
  {
    static void Main(string[] args)
    {
      byte[] buffer = null;

 

      string testString = "Stream!Hello world";
      char[] readCharArray = null;
      byte[] readBuffer = null;
      string readString = string.Empty;
      
      using (MemoryStream stream = new MemoryStream())
      {
        Console.WriteLine("初始字符串为:{0}", testString);
        //如果该流可写
        if (stream.CanWrite)
        {
          //将testString写入流中
          
          buffer = Encoding.Default.GetBytes(testString);
          //从该数组的第一个位置开始写,长度为3

          stream.Write(buffer, 0, 3);

 

          Console.WriteLine("现在Stream.Postion在第{0}位置", stream.Position + 1);

 

          //从刚才结束的位置(当前位置)往后移3位,到第7位
          long newPositionInStream = stream.CanSeek ? stream.Seek(3, SeekOrigin.Current) : 0;

 

          Console.WriteLine("重新定位后Stream.Postion在第{0}位置", newPositionInStream + 1);
          if (newPositionInStream < buffer.Length)
          {
            //从新位置(第7位)一直写到buffer的末尾
            stream.Write(buffer, (int)newPositionInStream, buffer.Length - (int)newPositionInStream);
          }

 


          //写完后将stream的Position属性设置成0,开始读流中的数据
          stream.Position = 0;

 

          // 设置一个空的变量来接收流中的数据,长度根据stream的长度来决定
          readBuffer = new byte[stream.Length];

 


          //设置stream总的读取数量 ,
          //流已经把数据读到了readBuffer中
          int count = stream.CanRead ? stream.Read(readBuffer, 0, readBuffer.Length) : 0;

 


          

 

          //通过流读出的readBuffer的数据求出从相应Char的数量
          int charCount = Encoding.Default.GetCharCount(readBuffer, 0, count);
          //通过该Char的数量 设定一个新的readCharArray数组
          readCharArray = new char[charCount];

          Encoding.Default.GetDecoder().GetChars(readBuffer, 0, count, readCharArray, 0);
          for (int i = 0; i < readCharArray.Length; i++)
          {
            readString += readCharArray[i];
          }
          Console.WriteLine("读取的字符串为:{0}", readString);
        }

 

        stream.Close();
      }

 

      Console.ReadLine();

 

    }
  }
}

 

 

结果如下:

 

举例:

(1)BinaryWriter 和 BinaryReader

BinaryWriter 和 BinaryReader 类用于读取和写入数据,而不是字符串。向新的空文件流 (Test.data) 写入数据及从中读取数据。在当前目录中创建了数据文件之后,也就同时创建了相关的 BinaryWriter 和 BinaryReader,BinaryWriter 用于向 Test.data 写入整数 0 到 10,Test.data 将文件指针置于文件尾。在将文件指针设置回初始位置后,BinaryReader 读出指定的内容。

 

 

using System;
using System.IO;
class MyStream 
{
    private const string FILE_NAME = "Test.data";
    public static void Main(String[] args) 
    {
        // 创建空白文件
        if (File.Exists(FILE_NAME)) 
        {
            Console.WriteLine("{0} already exists!", FILE_NAME);
            return;
        }
        FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew);
        // 创建BinaryWriter实例 用于写文件
        BinaryWriter w = new BinaryWriter(fs);
        // 写文件
        for (int i = 0; i < 11; i++) 
        {
            w.Write( (int) i);
        }
        w.Close();
        fs.Close();
        // 创建BinaryReader实例用于读文件
        fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
        BinaryReader r = new BinaryReader(fs);
        // 读文件
        for (int i = 0; i < 11; i++) 
        {
            Console.WriteLine(r.ReadInt32());
        }
        r.Close();
        fs.Close();
    }
}

(2)从文件读文本

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        try 
        {
            // 创建StreamReader 实例读文件.
            
            using (StreamReader sr = new StreamReader("TestFile.txt")) 
            {
                String line;
                // 读文件到结尾并展示
                
                while ((line = sr.ReadLine()) != null) 
                {
                    Console.WriteLine(line);
                }
            }
        }
        catch (Exception e) 
        {
            // 捕获异常
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}
 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap