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;
}
}
}
}
}
答案 0 :(得分:5)
问题在于:
outputWriter.Write(data);
StringWriter.Write
没有超载期待byte[]
。因此,调用Write(Object)
。根据{{3}}:
通过调用该对象上的ToString方法,将对象的文本表示写入文本字符串或流。
在字节数组上调用ToString
会返回System.byte[]
,说明如何在StringWriter
中获取该字符串。
答案 1 :(得分:1)
原因很简单:
data
的类型为byte[]
。 byte[]
StringWriter
上没有超载,因此它使用overload for object。然后在盒装字节数组上调用ToString()
,它只打印类型。
您的代码与此相同:
outputWriter.Write(data.ToString());
答案 2 :(得分:0)
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,但在使用弱类型时代码的可读性较差。