2016-04-23 10 views
1

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

код 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); 
} 

только второй метод хорошо работает, когда первый метод всегда возвращает пустую строку. Я понимаю, что это различное поведение происходит из-за разного размещения блока возврата по отношению к окончательному блоку. Каково точное поведение для этого?

+4

код [ '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). –

+0

@ElliottFrisch "* Остальные данные (т. Е. Все) *« Правильно ли это? Я знал, что если мы не назовем 'close()' ', тем не менее существует огромная вероятность того, что какой-то поток будет передан; close() гарантирует получение 100% данных. Я ошибаюсь? –

+0

@rev_dihazum Это буферизировано; в буфере может быть какой-либо (или отсутствующий) контент, если вы не «очистите» его. Это может привести к очень сложным ошибкам. –

ответ

0

Причина в том, что в первом способе возврата выполняется оператор, прежде чем сделать deflaterOutputStream.close(); Хотя второй сделать операцию закрытия первого

deflaterOutputStream записывает данные byteArrayOutputStream, когда он закрывает соединение. До deflaterOutputStream закрыт, byteArrayOutputStream не содержит данных.

+0

Как закрытие deflaterOutputStream после возвращения влияет на выход метода? Если он не закрыт, все же Base64.encodeBytes (byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES) должен вернуть правильное значение, не так ли? –

+0

Нет, предполагается, что если вы его не закроете, он не освободит память и не напишет, это значит, что она не вернет правильное значение ... – Dazak

+0

Итак, когда мы закрываем deflatedOutputStream, он записывает/выдает значения в byteArrayOutputStream? –

2

На втором примере byteArrayOutputStream заселяется, потому что deflaterOutputStream закрыт и промыт.

-1

Даже если вы разместили return заявления в Ьге блоке, ваш, наконец, блок будет выполняется, функциональность finally блока,

Если исключение поднимаются или не подняли, хотя, если исключение поднято и обработано или не обрабатывается затем finally блок выполнит, наконец, блок не будет выполняться, если поместить system.exit() в try или catch блок

в коде

try{ 
return------> this wont return instead finally block will execute 
} 
finally{ 
// 
} 

Ваше закрытие DeflaterOutputStream и покраснел так она возвращается пустой

 Смежные вопросы

  • Нет связанных вопросов^_^