c# - StreamReader ReadToEnd() 在第一次尝试时返回空字符串

标签 c# streamreader

我知道之前在 Stackoverflow 上有人问过这个问题,但找不到解释。

当我尝试从压缩字节数组中读取字符串时,我在第一次尝试时得到了一个空字符串,在第二次我成功并获得了字符串。

代码示例:

public static string Decompress(byte[] gzBuffer)
{
    if (gzBuffer == null)
        return null;
    using (var ms = new MemoryStream(gzBuffer))
    {
        using (var decompress = new GZipStream(ms, CompressionMode.Decompress))
        {
            using (var sr = new StreamReader(decompress, Encoding.UTF8))
            {
                string ret = sr.ReadToEnd();
                // this is the extra check that is needed !?
                if (ret == "")
                    ret = sr.ReadToEnd();
                return ret;
            }
        }
    }
}

感谢所有建议。 - 维克多·卡塞尔

最佳答案

我发现了错误。正如迈克尔在压缩例程中所建议的那样。我错过了在 GZipStream 上调用 Close()。

public static byte[] Compress(string text)
{
    if (string.IsNullOrEmpty(text))
        return null;

    byte[] raw = Encoding.UTF8.GetBytes(text);
    using (var ms = new MemoryStream())
    {
        using (var compress = new GZipStream (ms, CompressionMode.Compress))
        {
            compress.Write(raw, 0, raw.Length);
            compress.Close();

            return ms.ToArray();
        }
    } 
}

发生的事情是,数据似乎以错误的状态保存,之后需要在解压缩例程中两次调用 ReadToEnd() 才能提取相同的数据。很奇怪!

关于c# - StreamReader ReadToEnd() 在第一次尝试时返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461445/

相关文章:

c# - StreamReader 读取行范围

C# - 使用 StreamReader 并行化 While 循环导致高 CPU

c# - iTunes SDK/API 文档在哪里?

C# 在 Windows 中读取视频元数据(标题、描述、年份)

c# - 检查文件末尾的固定长度标记

c# - 正确处理responseStream和StreamReader关闭

c# - 在 C# 中使用 streamReader 类读取具有动态列数的文本文件

c# - 从 methodinfo 获取委托(delegate)

c# - 创建一个成功创建到单个应用程序的 WH_SHELL Hook 的 C# 项目

c# - nunit 测试仅在作为 tfs msbuild 进程的一部分运行时抛出异常