3

UnZipFile方法将数据从inputStream写入outputWriter。为什么sr.ToString()返回System.Byte[]而不是数据?

using (var sr = new StringWriter())
{
    UnZipFile(response.GetResponseStream(), sr);
    var content = sr.ToString();
}


public static void UnZipFile(Stream inputStream, TextWriter outputWriter)
{
    using (var zipStream = new ZipInputStream(inputStream))
    {
        ZipEntry currentEntry;
        if ((currentEntry = zipStream.GetNextEntry()) != null)
        {
            var size = 2048;
            var data = new byte[size];
            while (true)
            {
                size = zipStream.Read(data, 0, size);
                if (size > 0)
                {
                    outputWriter.Write(data);                       
                }
                else
                {
                    break;
                }
            }
        }
    }
}
4

3 回答 3

5

问题就出在这条线上:

outputWriter.Write(data); 

StringWriter.Write没有期望 a 的重载byte[]。因此,Write(Object)改为调用。根据MSDN

通过调用该对象的 ToString 方法,将对象的文本表示形式写入文本字符串或流。

调用ToString字节数组返回System.byte[],解释如何在StringWriter.

于 2012-09-10T15:17:02.053 回答
1

原因很简单:

data是类型byte[]byte[]on没有重载,StringWriter因此它使用object 的重载。然后调用ToString()仅打印类型的盒装字节数组。

您的代码等效于:

outputWriter.Write(data.ToString());
于 2012-09-10T15:16:18.740 回答
0

无神论者,

看看这里的其他答案,我将不得不同意“ToString()”返回 System.Byte [] 的原因是因为这是您放入其中的内容,并且放入 StringWriter 的所有内容都称为它自己的这样做时的“ToString”方法。(即 byte[].toString() = "System.byte[]")。事实上,整个想法是 StringWriter 仅用于写入字符串“缓冲区”(StringBuilder),因此理论上如果您的文件足够大(大于 2048),您的输出将是“System.Byte [] System .Byte[]”(等等)。尝试将其压缩为内存流,然后从该流中读取,可能会更好地了解您正在查看的内容。(代码未经测试,只是示例)。

using (Stream ms = new MemoryStream())  
{
    UnZipFile(response.GetResponseStream(), ms);

    string content;

    ms.Position = 0;
    using(StreamReader s = new StreamReader(ms))
    {
        content = s.ReadToEnd();
    } 
}

public static void UnZipFile(Stream inputStream, Stream outputWriter)
{      
    using (var zipStream = new ZipInputStream(inputStream))
    {
        ZipEntry currentEntry;
        if ((currentEntry = zipStream.GetNextEntry()) != null)
        {
            int size = 2048;
            byte[] data = new byte[size]; 
            while (true)
            {
                size = zipStream.Read(data, 0, size);
                if (size > 0)
                {
                    outputWriter.Write(data);
                }
                else
                {
                    break;
                }
            }
        }
    }
}

另一个想法实际上是使用 endcoding 来获取字符串

public string UnZipFile(Stream inputStream)
{
    string tmp;

    using(Stream zipStream = new ZipInputStream(inputStream))
    {
        ZipEntry currentEntry;

        if(currentEntry = zipStream.GetNextEntry()) != null)
        {
            using(Stream ms = new MemoryStream())
            {
                int size = 2048;
                byte[] data = new byte[size];
                while(true)
                {
                    if((size = zipStream.Read(data,0,size)) > 0)
                        ms.Write(data);
                    else
                        break;
                }
                tmp = Encoding.Default.GetString(ms.ToByteArray());
                }
            }
        }
    }
    return tmp;
}

或者作为最后一个想法,您实际上可以将原始代码更改为

outputWriter.Write(Encoding.Default.GetString(data));

代替

outputWriter.Write(data);

顺便说一句,请避免在帖子中使用 var 关键字,这可能只是我的小毛病,但使用弱类型时代码的可读性较差。

StringWriter.Write:MSDN StringWriter.ToString:MSDN

于 2012-09-10T15:38:25.553 回答