将字符串转换为C#中的流:新手指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为何需要从普通字符串生成流?

\n\n

想象这样一个场景:你正在用 C# 编写一个需要处理某些数据的应用程序。你以普通字符串的形式接收到数据,但你的库或方法却固执地要求提供一个 Stream 类型的对象。该怎么办?手动敲出来?另寻他法?不!你只需将字符串转换为流即可。

\n\n

这是每个 C# 开发者都会遇到的细小但非常频繁的任务之一。在 Stack Overflow 上,关于 "如何从字符串生成流?" 的问题已有数千次浏览——可见这个话题确实很受欢迎。在本文中,我们将分解不止一种解决方案,从最简单到更灵活的方法,并弄清楚在你的项目中最好使用哪一种。

\n\n

准备好了吗?开始吧!

\n\n

方案一:经典方法——MemoryStream 与 Encoding

\n\n

最直接且最常用的方法是:获取字符串,将其转换为字节数组,然后将该数组包装到 MemoryStream 中。要将字符串转换为字节,我们需要 Encoding 类。

\n\n
using System;\nusing System.IO;\nusing System.Text;\n\npublic class StreamFromStringExample\n{\n    public static void Main()\n    {\n        string myString = "Hello, world! This is a string for the stream.";\n        \n        // 将字符串转换为字节数组(使用 UTF-8)\n        byte[] byteArray = Encoding.UTF8.GetBytes(myString);\n        \n        // 从字节数组创建流\n        using (MemoryStream stream = new MemoryStream(byteArray))\n        {\n            // 现在我们有了一个流!可以进行读取、写入等操作\n            Console.WriteLine($"Stream length: {stream.Length} bytes");\n            Console.WriteLine($"Stream position: {stream.Position}");\n            \n            // 示例:将流读取回字符串\n            stream.Position = 0; // 返回到开头\n            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))\n            {\n                string result = reader.ReadToEnd();\n                Console.WriteLine($"Read from stream: {result}");\n            }\n        }\n    }\n}
\n\n

这里发生了什么?

\n
    \n
  • Encoding.UTF8.GetBytes() — 将我们的字符串转换成字节序列。为什么用 UTF-8?因为它是互联网及大多数现代应用程序的事实标准。它支持所有 Unicode 字符,并且对拉丁文字符效率较高。
  • \n
  • new MemoryStream(byteArray) — 创建一个"包装"我们字节数组的流。该流已准备好进行读取。
  • \n
\n\n

当你需要简单快速地创建一个用于一次性读取的流时,这种方法非常理想。它简洁且易于理解。

\n\n

重要细节:编码

\n

始终要记住编码!如果你使用 Encoding.ASCII 而不是 Encoding.UTF8,你将丢失所有不在基本 ASCII 表中的字符(例如,俄语字母 "Привет" 会变成 "??????")。对于俄语以及任何通用文本,请使用 Encoding.UTF8 或 Encoding.Unicode。

\n\n

方案二:StringReader——当你需要的是文本流而非字节流时

\n\n

如果你不需要字节流,而 specifically 需要文本流,该怎么办?为此,C# 提供了一个极好的类 StringReader。它并非 Stream 的子类,但它实现了 TextReader 接口,这通常就足够了。

\n\n
using System;\nusing System.IO;\n\npublic class StringReaderExample\n{\n    public static void Main()\n    {\n        string data = "Line 1\\nLine 2\\nLine 3";\n        \n        // 创建一个 StringReader\n        using (StringReader reader = new StringReader(data))\n        {\n            string line;\n            // 逐行读取\n            while ((line = reader.ReadLine()) != null)\n            {                

博客

书籍推荐