如何在 C# 中获取解压缩的 gzipstream 的位置和长度?
how to get position and length of unzipped gzipstream in c#?
我正在尝试使用二进制 reader 读取 .gz 文件,首先使用 gzipstream 解压缩,然后使用 gzipstream 创建一个新的二进制文件 reader。但是,当我尝试使用 BinaryReader 的 BaseStream.Position 和 BaseStream.Length 时(知道我什么时候在我的文件末尾),我得到一个 NotSupportedException,检查 GZipStream 中这些字段的文档 Class 显示:
长度
此 属性 不受支持,并且始终抛出 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 调用
您可以将 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
}
}
根据您正在解码的内容,您可以使用 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
//
}
我正在尝试使用二进制 reader 读取 .gz 文件,首先使用 gzipstream 解压缩,然后使用 gzipstream 创建一个新的二进制文件 reader。但是,当我尝试使用 BinaryReader 的 BaseStream.Position 和 BaseStream.Length 时(知道我什么时候在我的文件末尾),我得到一个 NotSupportedException,检查 GZipStream 中这些字段的文档 Class 显示:
长度
此 属性 不受支持,并且始终抛出 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 调用您可以将 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
}
}
根据您正在解码的内容,您可以使用 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
//
}