C#中流的使用和分类

 更新时间:2022年07月31日 15:08:03   作者:Darren Ji  
这篇文章介绍了C#中流的使用和分类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

使用流读取、写入文件

使用流把文件读取到字节数组:

//FileMode.Create, FileMode.Append 
//FileAccess.Write, FileAccess.ReadWrite 
//FileMode和FileAccess搭配使用,如果第二个参数FileMode.Appden写追加,第三个参数FileAccess.Read只读,会抛异常 
Stream source = new FileStream(@"1.jpg",FileMode.Open, FileAccess.Read) 
byte[] buffer = new byte[source.Length]; 
int bytesRead = source.Read(buffer, i, (int)source.Length);

Int32类型的最大值,以及Byte, KB, MB, GB转换:

Int32.MaxValue = 2147483647 Byte 
2147483647/1024 = 2097152 KB(1 KB = 1024 Byte) 
2097152/1024 = 2048 MB(1 M = 1024 KB) 
2048/1024 = 2 G(1G = 1024M)

使用流把字节数组写到文件:

Stream target = new FileStream(@"2.jpg", FileMode.Create, FileAccess.Write);
 
Stream source = new FileStream(@"1.jpg",FileMode.Open, FileAccess.Read) 
byte[] buffer = new byte[source.Length]; 
int bytesRead = source.Read(buffer, i, (int)source.Length);
 
target.Write(buffer, 0, buffer.Length); 
source.Dispose(); 
target.Dispose();

使用流对大文件进行分批读取和写入:

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

流的分类

在Stream抽象类下包含:
→FileStream→IsolatedStoreageFileStream
→MemoryStream
→NetworkStream

基础流

从流中读取数据:

CanRead()
Read(byte[] buffer, int offset, int count)

向流中写入数据:

CanWrite()
Write(byte[] buffer, int offset, int count)
WriteByte(Byte value)

移动流指针:

CanSeek()
Seek(long offset, SeekOrigion)
Position流的指针位置
Close()
Dispose()
Flush()将缓存设备写入存储设备
CanTimeout()
ReadTimeout()
WriteTimeout()
Length
SetLength(long value)

装饰器流

实现了Decorator模式,包含对Stream抽象基类的引用,同时继承自Stream抽象基类。

  • System.IO.Compression下的DeflateStream和GZipStream用于压缩和解压缩
  • System.Security.Cryptography下的CryptoStream用于加密和解密
  • System.Net.Security下的AuthenticatedStream用于安全性
  • System.IO下的BufferedStream用户缓存

包装器类

不是流类型,而是协助开发者处理流包含的数据,并且不需要将流读取到Byte[]字节数组中。但流的包装器类包含了对流的引用。

StreamReader

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

FileStream fs = new FileStream("a.txt", FileMode.Open, FileAcess.Read); 
StreamReader reader = new StreamReader(fs, Encoding.GetEncoding("GB2312"));
 
//或者 
//StreamReader reader = new StreamReader("a.txt"); //默认采用UTF-8编码方式

StreamWriter

继承自TextWriter。
将字符写入到流中。

string text = 
@"aa 
bb 
cc";
 
StringReader reader = new StringReader(text); 
int c = reader.Read(); 
Console.Write((char)c);
 
char[] buffer = new char[8]; 
reader.Read(buffer, 0, buffer.Length); 
Console.Write(String.Join("",buffer));
 
string line = reader.ReadLine(); 
Console.WriteLine(line);
 
string rest = reader.ReadToEnd(); 
Console.Write(); 
reader.Dispose();

StringReader和StringWriter

也继承自TextReader和TextWriter,但是用来处理字符串。

BinaryWriter和BinaryReader

BinaryWriter用于向流中以二进制方式写入基元类型,比如int, float, char, string等.BinaryReader用于从流中读取基元类型。注意,这2个类并不是继承TextReader和TextWriter。

namespace ConsoleApplication29 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            Product p = new Product("product.bin") 
            { 
                Id = 1, 
                Name = "GOOD", 
                Price = 500F 
            }; 
            p.Save();
 
            Product newP = new Product("product.bin"); 
            newP.Load(); 
            Console.WriteLine(newP); 
            Console.ReadKey(); 
        } 
    }
 
    public class Product 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public double Price { get; set; }
 
        private string filePath;
 
        public Product(string filePath) 
        { 
            this.filePath = filePath; 
        }
 
        public void Save() 
        { 
            FileStream fs = new FileStream(this.filePath, FileMode.Create,FileAccess.Write); 
            BinaryWriter writer = new BinaryWriter(fs); 
            writer.Write(this.Id); 
            writer.Write(this.Name); 
            writer.Write(this.Price); 
            writer.Dispose(); 
        }
 
        public void Load() 
        { 
            FileStream fs = new FileStream(this.filePath, FileMode.Open,FileAccess.Read); 
            BinaryReader reader = new BinaryReader(fs); 
            this.Id = reader.ReadInt32(); 
            this.Name = reader.ReadString(); 
            this.Price = reader.ReadDouble(); 
            reader.Dispose(); 
        }
 
        public override string ToString() 
        { 
            return String.Format("Id:{0},Name:{1},Price:{2}", this.Id, this.Name, this.Price); 
        } 
    } 
}

结果:

编码方式:
定义了字节如何转换成人类可读的字符或者文本,可以看作是字节和字符的对应关系表。在读取文件采用的编码方式要和创建文件采用的编码方式保持一致。

帮助类

在System.IO命名空间下。

  • File

FileStream fs = File.Create("a.txt");
Open(string path, FileMode mode)
OpenRead()
OpenWrite()
ReadAllText()
ReadAllByte()
WriteBllBytes()
WriteAllLines()
Copy(string sourceFileName, string destFileName)

  • FileInfo
  • Path
  • Directory
  • DirectoryInfo

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • SQLite之C#版 System.Data.SQLite使用方法

    SQLite之C#版 System.Data.SQLite使用方法

    这篇文章主要介绍了SQLite之C#版 System.Data.SQLite使用方法,需要的朋友可以参考下
    2020-10-10
  • 图文介绍c#封装方法

    图文介绍c#封装方法

    在本篇内容里小编给大家分享的是关于c#使用封装方法以及相关知识点,对此有需要的朋友们可以学习下。
    2018-12-12
  • 详解C#之事件

    详解C#之事件

    这篇文章主要介绍了C#之事件的知识点,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以参考下
    2020-06-06
  • C#算法之散列表

    C#算法之散列表

    本文详细讲解了C#算法之散列表,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#中抛出异常用法实例

    C#中抛出异常用法实例

    这篇文章主要介绍了C#中抛出异常用法,实例分析了C#使用throw抛出异常的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# DataSet结合FlyTreeView实现显示树状模型数据

    C# DataSet结合FlyTreeView实现显示树状模型数据

    NineRays.WebControls.FlyTreeView 是 9rays.net 推出的一款功能强大的树状模型数据显示控件,本文主要介绍了如何使用其并结合 DataSet对象进行数据显示,感兴趣的可以了解下
    2024-04-04
  • 详解三种C#实现数组反转方式

    详解三种C#实现数组反转方式

    本篇文章主要介绍了详解三种C#实现数组反转方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    这篇文章主要介绍了C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例,每次解密时从密文中截取前16位,这就是实现随机的奥秘,本文同时给出了实现代码,需要的朋友可以参考下
    2015-07-07
  • c# FTP上传文件实例代码(简易版)

    c# FTP上传文件实例代码(简易版)

    下面小编就为大家分享一篇c# FTP上传文件的实例代码,超简单哦~希望对大家有所帮助。一起跟随小编过来看看吧,
    2017-12-12
  • 不用IDE写C#的Hello World的方法

    不用IDE写C#的Hello World的方法

    这篇文章主要介绍了不用IDE写C#的Hello World的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-10-10

最新评论