首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET DeflateStream使用率

.NET DeflateStream使用率
EN

Stack Overflow用户
提问于 2012-07-02 22:03:52
回答 1查看 2.1K关注 0票数 1

我正在尝试通过DeflateStream在.NET中利用充气压缩流。我的代码抛出了一个InvalidDataException,尽管我知道我传递的数据已经被DEFLATE算法正确地处理了(它已经过测试)。我是否错误地使用了DeflateStream?我的代码如下:

代码语言:javascript
复制
public byte[] Inflate(byte[] deflateArr)
    {
        MemoryStream ms;

        // try to create a MemoryStream from a byte array
        try
        {
            ms = new MemoryStream(deflateArr);
        }
        catch (ArgumentNullException)
        {
            return null;
        }

        // create a deflatestream and pass it the memory stream
        DeflateStream ds;
        try
        {
            ds = new DeflateStream(ms, CompressionMode.Decompress);
        }
        catch (ArgumentNullException)
        {
            return null;
        }
        catch (ArgumentException)
        {
            return null;
        }

        // create a bytes array and read into it
        byte[] bytes = new byte[4096];

        try
        {
            ds.Read(bytes, 0, 4096);
        }
        catch (ArgumentNullException)
        {
            return null;
        }
        catch (InvalidOperationException)
        {
            return null;
        }
        catch (ArgumentOutOfRangeException)
        {
            return null;
        }
        catch (InvalidDataException)
        {
            return null;
        }

        // close the memory stream
        ms.Close();

        // close the deflate stream
        ds.Close();

        return bytes;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-02 22:09:17

不,你不是。

这段代码有问题:

  • 显式调用Close(),而不是使用using语句。在这里可能不是有害的,但这是一个坏主意。
  • 捕获了各种您实际上根本不应该捕获的异常,因为它们指出了编程错误,
  • 在每个语句的基础上捕获异常,即使您在整个代码中以相同的方式对待它们(因此可以捕获更大的异常( block)
  • Ignoring为Stream.Read

的返回值

假设你使用的是.NET 4(用于Stream.CopyTo),这里有一个更好的版本

代码语言:javascript
复制
public static byte[] Inflate(byte[] inputData)
{
    using (Stream input = new DeflateStream(new MemoryStream(inputData),
                                            CompressionMode.Decompress))
    {
        using (MemoryStream output = new MemoryStream())
        {
            input.CopyTo(output);
            return output.ToArray();
        }
    }
}

现在,您可能想要捕获InvalidDataException --就我个人而言,在这一点上我不会这么做,但这样做可能是有意义的。(如果有必要,我会在调用端捕获它。如有必要,您始终可以将此方法包装在另一个方法中。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11295300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档