我尝试使用二进制阅读器读取.gz文件,首先使用gzipstream解压缩,然后使用gzipstream创建一个新的二进制阅读器。但是,当我尝试使用BinaryReader的BaseStream.Position和BaseStream.Length时(知道我在文件末尾的时间),我得到一个NotSupportedException,检查GZipStream类中这些字段的doc显示:
长度
不支持此属性并始终抛出NotSupportedException。(重写Stream.Length。)
位置
不支持此属性,并始终抛出NotSupportedException。(重写Stream.Position。)
所以我的问题是,当我使用BinaryReader读取解压缩的GZipStream时,我怎么知道文件末尾的时间?感谢
这是我的代码:
Stream stream = new MemoryStream(textAsset.bytes);
GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress);
using (BinaryReader reader = new BinaryReader(zippedStream))
while(reader.BaseStream.Position != reader.BaseStream.Length)
{
//do stuff with BinaryReader
}
上述抛出: NotSupportedException:不支持操作。 System.IO.Compression.DeflateStream.get_Position()
由于while()
中的BaseStream.Position调用答案 0 :(得分:1)
您可以将zippedStream
复制到MemoryStream
实例,可以使用ToArray
功能完整阅读。这是我能想到的最简单的解决方案。
Stream stream = new MemoryStream(textAsset.bytes);
byte[] result;
using (GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress))
{
using (MemoryStream reader = new MemoryStream())
{
zippedStream.CopyTo(reader);
result = reader.ToArray();
}
}
或者,如果你想以块的形式阅读流
using (GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress))
{
byte[] buffer = new byte[16 * 1024];
int read;
while ((read = zippedStream.Read(buffer, 0, buffer.Length)) > 0)
{
// do work
}
}
答案 1 :(得分:1)
根据要解码的内容,可以使用BinaryReader将第一种类型读入字节数组,然后使用BitConverter将这些字节转换为所需的类型。然后,您可以照常使用BinaryReader,直到下一条记录开始。
byte[] headermarker = new byte[4];
int count;
// if bytes available in underlying stream.
while ((count = br.Read(headermarker, 0, 4) > 0 )
{
Int32 marker = BitConverter.ToInt32(headermarker, 0);
//
// now use Binary Reader for the rest of the record until we loop
//
}