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
ラップbos
するので、データベースへの基outStream
になるストリームを閉じますdeflaterStream.close()
。bos.close()
outStream.close()
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 の使用方法に何か問題がありますか?