3

UnZipFileinputStreamメソッドは、からにデータを書き込みます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を期待する過負荷はありませんbyte[]。したがって、Write(Object)代わりにが呼び出されます。そしてMSDNによると:

オブジェクトのToStringメソッドを呼び出すことにより、オブジェクトのテキスト表現をテキスト文字列またはストリームに書き込みます。

ToStringバイト配列を呼び出すと、が返されSystem.byte[]、でその文字列を取得する方法が説明されますStringWriter

于 2012-09-10T15:17:02.053 に答える
1

理由は簡単です:

dataタイプbyte[]です。byte[]onにはオーバーロードがないため、オブジェクトStringWriterのオーバーロードを使用します。次に、タイプを出力するだけのボックス化されたバイト配列を呼び出します。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;
                }
            }
        }
    }
}

別のアイデアは、実際にはエンドコーディングを使用して文字列を取得することです

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

于 2012-09-10T15:38:25.553 に答える