如何从Stream中读取一个字符?

时间:2014-11-10 13:30:28

标签: c# .net

我有一个包含一些文本数据的Stream(可以是ASCII,UTF-8,Unicode;编码已知)。我需要从流中读取一个字符,而不再提升流位置。 StreamReader是不合适的,因为它积极地从流中预取数据 想法?

1 个答案:

答案 0 :(得分:2)

如果你想一次读取和解码一个字节的文本,我所知道的最方便的方法是使用System.Text.Decoder类。

这是一个简单的例子:

class Program
{
    static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.Unicode;

        string originalText = "Hello world! ブ䥺ぎょズィ穃 槞こ廤樊稧 ひゃご禺 壪";
        byte[] rgb = Encoding.UTF8.GetBytes(originalText);
        MemoryStream dataStream = new MemoryStream(rgb);
        string result = DecodeOneByteAtATimeFromStream(dataStream);

        Console.WriteLine("Result string: \"" + result + "\"");
        if (originalText == result)
        {
            Console.WriteLine("Original and result strings are equal");
        }
    }

    static string DecodeOneByteAtATimeFromStream(MemoryStream dataStream)
    {
        Decoder decoder = Encoding.UTF8.GetDecoder();
        StringBuilder sb = new StringBuilder();
        int inputByteCount;
        byte[] inputBuffer = new byte[1];

        while ((inputByteCount = dataStream.Read(inputBuffer, 0, 1)) > 0)
        {
            int charCount = decoder.GetCharCount(inputBuffer, 0, 1);
            char[] rgch = new char[charCount];

            decoder.GetChars(inputBuffer, 0, 1, rgch, 0);
            sb.Append(rgch);
        }
        return sb.ToString();
    }
}

据推测,您已经意识到一次只处理一个字节处理任何类型数据的缺点。 :)我只想说,这不是一种非常有效的做事方式。