java关闭文件句柄_java-JAI关闭文件句柄为时过早吗?

我正在使用JAI读取Java中的Tiff文件.

使用此代码:

RenderedOp renderer = JAI.create("fileload", tifFilename);

return renderer.getAsBufferedImage();

在使用Java 7的一个盒子上工作正常,但在使用Java 8的其他盒子上工作得很好:

Caused by: com.sun.media.jai.codecimpl.util.ImagingException

at com.sun.media.jai.codecimpl.ImagingListenerProxy.errorOccurred(ImagingListenerProxy.java:63)

at com.sun.media.jai.codecimpl.TIFFImage.getTile(TIFFImage.java:1087)

at javax.media.jai.RenderedImageAdapter.getTile(RenderedImageAdapter.java:148)

at javax.media.jai.NullOpImage.computeTile(NullOpImage.java:162)

at com.sun.media.jai.util.SunTileScheduler.scheduleTile(SunTileScheduler.java:904)

at javax.media.jai.OpImage.getTile(OpImage.java:1129)

at javax.media.jai.PlanarImage.copyData(PlanarImage.java:2343)

at javax.media.jai.RenderedImageAdapter.copyData(RenderedImageAdapter.java:163)

at javax.media.jai.RenderedOp.copyData(RenderedOp.java:2299)

at javax.media.jai.PlanarImage.getAsBufferedImage(PlanarImage.java:2525)

at javax.media.jai.PlanarImage.getAsBufferedImage(PlanarImage.java:2546)

at ...

Caused by: com.sun.media.jai.codecimpl.util.ImagingException: IOException occured while reading TIFF image data.

... 17 more

Caused by: java.io.IOException: Stream Closed

at java.io.RandomAccessFile.seek0(Native Method)

at java.io.RandomAccessFile.seek(RandomAccessFile.java:557)

at com.sun.media.jai.codec.FileSeekableStream.read(FileSeekableStream.java:168)

at com.sun.media.jai.codec.SeekableStream.readFully(SeekableStream.java:318)

at com.sun.media.jai.codecimpl.TIFFImage.getTile(TIFFImage.java:1081)

... 16 more

解决方法:

我的理论是,垃圾回收正在启动并完成一些本不该进行的工作.很奇怪.替换为:

try (SeekableStream seekableStream = new FileSeekableStream(filename)){

TIFFDecodeParam param = null;

ImageDecoder dec = ImageCodec.createImageDecoder("tiff", seekableStream, param);

// convert to buffered image if desired

return new RenderedImageAdapter(dec.decodeAsRenderedImage()).getAsBufferedImage(); // convert to buffered image

}

问题似乎消失了.我的猜测是,因为FileSeekableStream的句柄保留在局部变量范围内,所以未过早收集它.可能还有其他JAI方法也可以做到这一点,只要确保在输入流上保留自己的句柄即可[?]

不确定是否也适用于其他图像格式

标签:java,garbage-collection,jai

来源: https://codeday.me/bug/20191013/1909758.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值