FilterOutputStream.close()
这是对 Java 8 中方法的更改,这给我们带来了一些问题。(见http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/759aa847dcaf)
在以前的 Java 版本中,以下代码可以正常工作而不会引发异常。但是,在 Java 8 下,当 try-with-resources 机制关闭流时,我们总是会遇到异常。
try( InputStream bis = new BufferedInputStream( inputStream );
OutputStream outStream = payloadData.setBinaryStream( 0 );
BufferedOutputStream bos = new BufferedOutputStream( outStream );
DeflaterOutputStream deflaterStream = new DeflaterOutputStream(
bos, new Deflater( 3 ) ) )
{
fileSize = IOUtil.copy( bis, deflaterStream );
}
try-with-resources 机制将首先调用close()
. deflaterStream
由于deflaterStream
wraps bos
which wraps outStream
,deflaterStream.close()
将调用bos.close()
which 将调用outStream.close()
which 关闭数据库的底层流。
try-with-resources 机制接下来会调用close()
. bos
由于bos
extends FilterOutputStream
,flush()
将首先被调用outStream
。但是,由于outStream
已经关闭,outStream.flush()
抛出异常:java.sql.SQLException: Closed LOB
caused by: java.io.IOException: Closed LOB
at oracle.jdbc.driver.OracleBlobOutputStream.ensureOpen(OracleBlobOutputStream.java:265)
at oracle.jdbc.driver.OracleBlobOutputStream.flush(OracleBlobOutputStream.java:167)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:141)
at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
at com.blah.uploadFile(CustomerUploadFacade.java:162)
... 38 more
Caused by: java.sql.SQLException: Closed LOB
at oracle.jdbc.driver.OracleBlobOutputStream.ensureOpen(OracleBlobOutputStream.java:257)
... 42 more
有没有其他人遇到过这个问题?如果是这样,您是如何解决的?我们使用 try-with-resources 的方式有问题吗?