Java 尝试后和尝试后返回位置时的不同行为

Java 尝试后和尝试后返回位置时的不同行为,java,outputstream,try-catch-finally,finally,try-finally,Java,Outputstream,Try Catch Finally,Finally,Try Finally,我有以下两个代码块,用于压缩字符串 代码1 代码2 只有第二个方法工作正常,第一个方法总是返回空字符串。我理解这种不同的行为是由于返回块相对于finally块的位置不同而产生的。具体的行为是什么?原因是在第一个方法中,return语句是在执行deflaterOutputStream.close()之前执行的而第二个先执行关闭操作 deflaterOutputStream关闭连接时,将数据写入byteArrayOutputStream。在关闭deflaterOutputStream之前,byteA

我有以下两个代码块,用于压缩字符串

代码1 代码2
只有第二个方法工作正常,第一个方法总是返回空字符串。我理解这种不同的行为是由于返回块相对于finally块的位置不同而产生的。具体的行为是什么?

原因是在第一个方法中,return语句是在执行
deflaterOutputStream.close()之前执行的而第二个先执行关闭操作


deflaterOutputStream
关闭连接时,将数据写入
byteArrayOutputStream
。在关闭
deflaterOutputStream
之前,
byteArrayOutputStream
不包含数据。

在第二个示例中,由于
deflaterOutputStream
已关闭且已刷新而填充
byteArrayOutputStream
,即使您在try块中放置了
return
语句,将执行finally块,
finally
块的功能是

如果引发或未引发异常,即使引发并已处理或未处理异常,那么将执行
finally
块,如果将
system.exit()
放入
try
catch
块,则不会执行finally块

在代码中

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

您关闭的
DeflaterOutputStream
已刷新,因此返回为空

返回后关闭DeflaterOutputStream如何影响方法的输出?如果它还没有关闭,Base64.encodeBytes(byteArrayOutputStream.toByteArray(),Base64.don_BREAK_LINES)应该返回一个正确的值,不是吗?不,假设如果你不关闭它,它不会释放内存也不会写入,这意味着它不会返回正确的值…所以当我们关闭deflatedOutputStream时,它将值写入/刷新到byteArrayOutputStream?正如@dur所说的,它将剩余的压缩数据写入输出流并关闭底层流。假设,如果您不
关闭
,则仍有未写入流的剩余数据(即所有数据)(另请参见)。另外,我更喜欢一个。@ElliottFrisch“还有剩余的数据(即所有数据)”,对吗?我知道如果我们不调用
close()
,仍然有很大的可能传输某些流;close()确保获得100%的数据。我错了吗?@rev_dihazum它被缓冲了;如果不清除缓冲区中的内容,缓冲区中可能有任何内容(或没有内容)。这会导致非常困难的错误。是的。。。。但我的问题是:在调用
close()
之前不会传输流?我知道这条流会被传送;关闭,只需刷新缓冲区
 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);
}
try{
return------> this wont return instead finally block will execute
}
finally{
//
}