Нет. Из ошибки памяти от 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;
}
, Который является достойным аргументом в пользу добавления поддержки регистрации/нерегистрации самособирающихся/уплотняющих объектов к сборщикам "мусора" в целом.
Для 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");
}
Я не тестировал код, но я думаю, что это должно работать, возможно, с некоторыми изменениями.
Для Base64 я рекомендую реализацию iHolder .
GZipinputStream - это то, что вам нужно для распаковки байтового массива GZip.
ByteArrayOutputStream - это то, что вы используете для записи байтов в память. Затем вы получаете байты и передаете их конструктору строкового объекта для их преобразования, желательно с указанием кодировки.