Как я могу распаковать поток в C #, как этот фрагмент кода Java? - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь преобразовать этот фрагмент кода Java в C #, но я немного запутался по этому поводу. Это код Java:

Моя попытка заключается в следующем, но в gis.Read есть некоторые ошибки, потому что по той же причине требуется символ *, а не байт [] и в конструкторе String.

public static String decompress(InputStream input) throws IOException 
{
    final int BUFFER_SIZE = 32;
    GZIPInputStream gis = new GZIPInputStream(input, BUFFER_SIZE);
    StringBuilder string = new StringBuilder();
    byte[] data = new byte[BUFFER_SIZE];
    int bytesRead;
    while ((bytesRead = gis.read(data)) != -1) {
        string.append(new String(data, 0, bytesRead));
    }
    gis.close();
    // is.close();
    return string.toString();
}

Я ожидал получить читабельную строку.

1 Ответ

2 голосов
/ 28 июня 2019

Вам нужно сначала преобразовать байты в символы.Для этого вам нужно знать кодировку.

В вашем коде вы могли бы заменить new String(data, 0, bytesRead) на Encoding.UTF8.GetString(data, 0, bytesRead), чтобы сделать это.Тем не менее, я бы справился с этим немного по-другому.

StreamReader - это полезный класс для чтения байтов как текста в C #.Просто оберните его вокруг вашего GZipStream и позвольте ему творить чудеса.

public static string Decompress(Stream input)
{
    // note this buffer size is REALLY small. 
    // You could stick with the default buffer size of the StreamReader (1024)
    const int BUFFER_SIZE = 32;
    string result = null;
    using (var gis = new GZipStream(input, CompressionMode.Decompress, leaveOpen: true))
    using (var reader = new StreamReader(gis, Encoding.UTF8, true, BUFFER_SIZE))
    {
        result = reader.ReadToEnd();
    }

    return result;
}
...