[英]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
獲取該字符串。
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,但在使用弱類型時代碼可讀性較差。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.