Я использую GZipStream
, чтобы сжать строку, и я изменил два разных примера, чтобы увидеть, что работает. Первый фрагмент кода, который является сильно измененной версией the example in the documentation, просто возвращает пустую строку.Почему один метод строкового сжатия возвращает пустую строку, а другой - нет?
public static String CompressStringGzip(String uncompressed)
{
String compressedString;
// Convert the uncompressed source string to a stream stored in memory
// and create the MemoryStream that will hold the compressed string
using (MemoryStream inStream = new MemoryStream(Encoding.Unicode.GetBytes(uncompressed)),
outStream = new MemoryStream())
{
using (GZipStream compress = new GZipStream(outStream, CompressionMode.Compress))
{
inStream.CopyTo(compress);
StreamReader reader = new StreamReader(outStream);
compressedString = reader.ReadToEnd();
}
}
return compressedString;
и когда я его отладки, все, что я могу сказать, ничего не читается из reader
, который compressedString
пуст. Однако второй способ, который я написал, был изменен с CodeProject snippet.
public static String CompressStringGzip3(String uncompressed)
{
//Transform string to byte array
String compressedString;
byte[] uncompressedByteArray = Encoding.Unicode.GetBytes(uncompressed);
using (MemoryStream outStream = new MemoryStream())
{
using (GZipStream compress = new GZipStream(outStream, CompressionMode.Compress))
{
compress.Write(uncompressedByteArray, 0, uncompressedByteArray.Length);
compress.Close();
}
byte[] compressedByteArray = outStream.ToArray();
StringBuilder compressedStringBuilder = new StringBuilder(compressedByteArray.Length);
foreach (byte b in compressedByteArray)
compressedStringBuilder.Append((char)b);
compressedString = compressedStringBuilder.ToString();
}
return compressedString;
}
Почему первый фрагмент кода не увенчался успехом, пока другой? Хотя они немного разные, я не знаю, почему незначительные изменения во втором фрагменте позволяют ему работать. Строка образца я использую SELECT * FROM foods f WHERE f.name = 'chicken';
Что-нибудь связанное с положением потока? Вы пробовали искать начало потока в методе 1 перед его чтением? – Charleh
Я добавил 'inStream.Seek (0L, SeekOrigin.Begin);' перед строкой: 'inStream.CopyTo (compress);', но метод по-прежнему возвращает пустую строку. –