C# к Java: Base64String, MemoryStream, GZipStream

Нет. Из ошибки памяти от GC, не должно обычно быть восстанавливаемым в текущем потоке. (Восстанавливаемый поток (пользователь или ядро) создание и завершение должен поддерживаться хотя)

Относительно встречных примеров: я в настоящее время работаю над проектом языка программирования D, который использует платформу NVIDIA CUDA для вычисления GPU. Вместо вручную руководящей памяти GPU я создал объекты прокси усилить GC D. Таким образом, когда GPU возвращается из ошибки памяти, я работаю, полное собирают и только повышают исключение, если это перестало работать во второй раз. Но, это не действительно пример из восстановления памяти, это - больше одна из интеграции GC. Другими примерами восстановления (кэши, свободные списки, стеки/хеши без автоматического уменьшения, и т.д.) являются все структуры, которые имеют их собственные методы собирающейся/уплотняющей памяти, которые являются отдельными от GC и имеют тенденцию не быть локальными для функции выделения. Таким образом, люди могли бы реализовать что-то как следующее:

T new2(T)( lazy T old_new ) {
    T obj;
    try{
        obj = old_new;
    }catch(OutOfMemoryException oome) {
        foreach(compact; Global_List_Of_Delegates_From_Compatible_Objects)
            compact();
        obj = old_new;
    }
    return obj;
}

, Который является достойным аргументом в пользу добавления поддержки регистрации/нерегистрации самособирающихся/уплотняющих объектов к сборщикам "мусора" в целом.

5
задан h22 1 February 2013 в 18:07
поделиться

2 ответа

Для Base64 у вас есть класс Base64 из Apache Commons и метод decodeBase64 , который принимает строку ] и возвращает байт [] .

Затем вы можете прочитать полученный байт [] в ByteArrayInputStream . Наконец, передайте ByteArrayInputStream в GZipInputStream и прочтите несжатые байты.


Код выглядит примерно так:

public static String Decompress(String zipText) throws IOException {
    byte[] gzipBuff = Base64.decodeBase64(zipText);

    ByteArrayInputStream memstream = new ByteArrayInputStream(gzipBuff);
    GZIPInputStream gzin = new GZIPInputStream(memstream);

    final int buffSize = 8192;
    byte[] tempBuffer = new byte[buffSize ];
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((size = gzin.read(tempBuffer, 0, buffSize)) != -1) {
        baos.write(tempBuffer, 0, size);
    }        
    byte[] buffer = baos.toByteArray();
    baos.close();

    return new String(buffer, "UTF-8");
}

Я не тестировал код, но я думаю, что это должно работать, возможно, с некоторыми изменениями.

5
ответ дан 14 December 2019 в 13:42
поделиться

Для Base64 я рекомендую реализацию iHolder .

GZipinputStream - это то, что вам нужно для распаковки байтового массива GZip.

ByteArrayOutputStream - это то, что вы используете для записи байтов в память. Затем вы получаете байты и передаете их конструктору строкового объекта для их преобразования, желательно с указанием кодировки.

1
ответ дан 14 December 2019 в 13:42
поделиться