6

我在尝试使用 SharpZipLib 库中的 .bz2 内容时遇到了真正的麻烦,而且我无法在其他地方找到任何帮助。

任何帮助或建议将不胜感激,如果有人能指出我可以从中学习的现有解决方案,那就太棒了!

以下是我正在尝试做的事情,但显然它不起作用。目前我遇到的问题是标记线上未处理“EndOfStreamException”。代码有点乱,我以前从来没有尝试过这样的事情......

正如您可能知道的那样,我是在解压缩之前从网上下载它的,但我很确定这部分代码可以正常工作。

while ((inputByte = responseStream.ReadByte()) != -1)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (BinaryWriter writer = new BinaryWriter(ms))
        {
            writer.Write((byte)inputByte);
        }

        using (BZip2InputStream unzip = new BZip2InputStream(ms)) //Exception occurs here
        {
            buffer = new byte[unzip.Length];
            unzip.Read(buffer, 0, buffer.Length);
        }

        using (FileStream fs = new FileStream(fPath, FileMode.OpenOrCreate, FileAccess.Write))
        {
            fs.Write(buffer, 0, buffer.Length);
        }

    }
}
4

2 回答 2

3

您正在使用using语句。 语句是用于将 a包裹在代码块周围的using编译器指令,并将在执行时调用。try finallyIDisposible.Dispose()finally

长话短说,在 , 上调用 dispose BinaryWriterBZip2InputStream并且FileStream可能会过早地对 parent 进行处理MemoryStream

尝试using从内部删除三个块MemoryStream,看看是否能解决您的问题。

编辑

BinaryWriter正在byteMemoryStream. 我不相信你需要一个BinaryWriter方法。MemoryStreamWriteByte()

然后你BZip2InputStream正试图从MemoryStream. 但是MemoryStream它的位置在流的末尾。没有要读取的数据,因此EndOfStreamException.

于 2012-12-22T00:22:25.923 回答
0

OP的代码有两个问题。第一个,正如 Jason Whitted 所提到的,是实例处理原因的using代码块,所以我们应该删除该块,因为它本身有一个方法,这可以使用以下方法以最干净的方式实现:BinaryWriterMemoryStreamMemoryStreamwrite

var ms = new MemoryStream();
ms.Write(inputBytes,0,inputBytes.Length); 

第二个问题是,当我们写入MemoryStream实例(ms)时,我们走到了它的末尾,所以在我们尝试使用之前,BZip2InputStream我们必须将位置改回内存流的开头:

ms.Seek(0, SeekOrigin.Begin); //THIS IS NECESSARY to change the position to the beginning
byte[] buffer = null;
using (var bz2InputStream = new BZip2InputStream(ms))
{
       buffer = new byte[bz2InputStream.Length];
       bz2InputStream.Read(buffer, 0, buffer.Length);
}
于 2018-10-09T12:33:37.667 回答