我在尝试使用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);
}
}
}
答案 0 :(得分:2)
您正在使用using
语句。 using
语句是编译器指令,try finally
包含在代码块中,IDisposible.Dispose()
将在执行finally
时被调用。
长话短说,在BinaryWriter
,BZip2InputStream
和FileStream
上调用dispose可能会过早地处置父MemoryStream
。
尝试从using
中删除三个MemoryStream
块,看看是否能解决您的问题。
修改强>
您的BinaryWriter
正在向byte
写一个MemoryStream
。我认为您不需要BinaryWriter
因为MemoryStream
有WriteByte()
方法。
然后您的BZip2InputStream
正试图从MemoryStream
中读取。但是MemoryStream
在流的末尾有它的位置。没有要读取的数据,因此EndOfStreamException
。
答案 1 :(得分:0)
OP的代码中有两个问题。 第一个,正如Jason Whitted提到的,using
的{{1}}代码块导致BinaryWriter
实例的处置,因此我们应该删除该块并因为MemoryStream
本身具有MemoryStream
方法,所以可以使用以下方法以最干净的方式实现:
write
第二个问题是,当我们写入var ms = new MemoryStream();
ms.Write(inputBytes,0,inputBytes.Length);
实例(ms)时,我们会转到它的结尾,因此在尝试使用MemoryStream
之前,我们必须将位置改回到内存流的开头:
BZip2InputStream