使用流读取器将文件内容转换为字符串数组,然后进行压缩

本文关键字:数组 字符串 然后 压缩 转换 读取 文件 | 更新日期: 2023-09-27 18:25:01

编辑:我需要将文本文件的内容转换为字符串数组,将它们写入另一个非类型化文件,然后将创建的文件压缩为 gzip。

下面我提供了我能够发现的答案,以及减压过程,如果需要的话。

使用流读取器将文件内容转换为字符串数组,然后进行压缩

这是我

用来gziping对象的方法:

byte[] initialBytes = //object serialized to bytes
byte[] compressedBytes;
        using (MemoryStream stream = new MemoryStream(initialBytes))
        {
            using (MemoryStream output = new MemoryStream())
            {
                using (GZipStream zipper = new GZipStream(output, CompressionMode.Compress))
                {
                    Pump(stream, zipper);
                }
                compressedBytes = output.ToArray();
            }
        }
 return compressedBytes;

//pump method
internal static void Pump(Stream input, Stream output)
    {
        byte[] bytes = new byte[4096];
        int n;
        while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
        {
            output.Write(bytes, 0, n);
        }
    }

如果我需要做一个文件:

byte[] result;
        using(FileStream file = //some filestream I created)
        {
            file.Position = 0;
            using (MemoryStream output = new MemoryStream())
            {
                using (GZipStream zipper = new GZipStream(output, CompressionMode.Compress))
                {
                    Pump(file, zipper);
                }
                result = output.ToArray();
            }
        }

        return result;
.

NET Framework 在基本库中提供了一个System.IO.Compression.DeflateStream类;它实现了 DEFLATE 压缩算法。 zlib 流只是 zlib 魔术字节,后跟使用 DEFLATE 算法压缩的内容。

哎呀,我给出了"zlib"流的说明,它比 gzip 更原始。 gzip除了压缩的内容外,还有一个目录和其他东西。

对于 gzip,请使用框架的 System.IO.Compression.GZipStream 类,如 Mike_G 的答案所示。

这就是我在这种情况下最终诉诸的。

    string jobDirVar = [FilePath];
    byte[] bytesToCompress = File.ReadAllBytes(jobDirVar);
    byte[] decompressedBytes = new byte[bytesToCompress.Length];
    using (FileStream fileToCompress = File.Create(FilePath))
        {
            using (GZipStream compressionStream = new GZipStream(fileToCompress, CompressionMode.Compress))
            {
                compressionStream.Write(bytesToCompress, 0, bytesToCompress.Length);
            }
        }
        using (FileStream fileToDecompress = File.Open(FilePath, FileMode.Open))
        {
            using (GZipStream decompressionStream = new GZipStream(fileToDecompress, CompressionMode.Decompress))
            {
                decompressionStream.Read(decompressedBytes, 0, bytesToCompress.Length);
            }
        }

这不是最漂亮的编码,但它似乎为我提供了我所追求的东西。如果其他人有任何可以简化事情的东西,我仍然很想听到它,不过!