首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAI是否过早关闭文件句柄?

JAI是否过早关闭文件句柄?
EN

Stack Overflow用户
提问于 2016-07-18 19:41:34
回答 1查看 859关注 0票数 1

我使用JAI来读取java中的Tiff文件。使用此代码:

代码语言:javascript
复制
RenderedOp renderer = JAI.create("fileload", tifFilename);
return renderer.getAsBufferedImage();

在一个带有java 7的盒子上工作得很好,但是对于另一个用java 8的盒子,可以得到以下内容:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-18 19:41:34

我的理论是垃圾收集是在启动并完成一些不该做的事情。非常奇怪。代之以:

代码语言:javascript
复制
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 s不是提前收集的,因为它的句柄仍然在局部变量范围内。可能还有其他JAI方法可以做到这一点,只需确保在inputstream上保留自己的句柄即可。

关联(帮助我发现了这方面的工作:RenderedImage to BufferedImage for multipage-tiff reading)

也是JAI create seems to leave file descriptors open

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38444752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档