У меня есть два блока кода, которые я использую для сжатия строки.Различные поведения при возврате места внутри и после попытки
код 1
public static String compressResponse(String response) throws IOException {
Deflater deflater = new Deflater(Deflater.DEFLATED, true);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
try {
deflaterOutputStream.write(response.getBytes(StandardCharsets.UTF_8));
return Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
} finally {
deflaterOutputStream.close();
}
}
код 2
public static String compressResponse(String response) throws IOException {
Deflater deflater = new Deflater(Deflater.DEFLATED, true);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
try {
deflaterOutputStream.write(response.getBytes(StandardCharsets.UTF_8));
} finally {
deflaterOutputStream.close();
}
return Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
}
только второй метод хорошо работает, когда первый метод всегда возвращает пустую строку. Я понимаю, что это различное поведение происходит из-за разного размещения блока возврата по отношению к окончательному блоку. Каково точное поведение для этого?
код [ 'close' JavaDoc] (https://docs.oracle.com/javase/8/docs/api/java/util/ zip/DeflaterOutputStream.html # close--) говорит: * записывает оставшиеся сжатые данные в выходной поток и закрывает базовый поток *. Предположительно, если вы не закрываете, есть * оставшиеся * данные (то есть все), которые не были записаны в поток (см. Также ['flush'] (https://docs.oracle.com/ JavaSE/8/документы/API/Java/Util/почтовый/DeflaterOutputStream.html # flush--)). Кроме того, я бы предпочел ['try-with-resources'] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). –
@ElliottFrisch "* Остальные данные (т. Е. Все) *« Правильно ли это? Я знал, что если мы не назовем 'close()' ', тем не менее существует огромная вероятность того, что какой-то поток будет передан; close() гарантирует получение 100% данных. Я ошибаюсь? –
@rev_dihazum Это буферизировано; в буфере может быть какой-либо (или отсутствующий) контент, если вы не «очистите» его. Это может привести к очень сложным ошибкам. –