簡體   English   中英

為什么StringWriter.ToString返回`System.Byte []`而不是數據?

[英]Why StringWriter.ToString return `System.Byte[]` and not the data?

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;
                }
            }
        }
    }
}

問題在於:

outputWriter.Write(data); 

StringWriter.Write沒有期望byte[]重載。 因此,改為調用Write(Object) 並根據MSDN

通過調用該對象上的ToString方法,將對象的文本表示寫入文本字符串或流。

在字節數組上調用ToString返回System.byte[] ,解釋如何在StringWriter獲取該字符串。

原因很簡單:

data的類型為byte[] StringWriter上的byte[]沒有重載,因此它使用對象重載 然后在盒裝字節數組上調用ToString() ,它只是打印類型。

您的代碼等同於:

outputWriter.Write(data.ToString());

theateist,

看看這里的其他答案,我將不得不同意“ToString()”返回System.Byte []的原因是因為這就是你所投入的內容,並且放入StringWriter的所有東西都稱它為自己的這樣做時“ToString”方法。 (即byte [] .toString()=“System.byte []”)。 事實上,整個想法是StringWriter僅用於寫入字符串“buffer”(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關鍵字,也許只是我的寵物peev,但在使用弱類型時代碼可讀性較差。

StringWriter.Write:MSDN StringWriter.ToString:MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM