2016-07-18 7 views
1

私はJavaのTiffファイルを読むためにJAIを使用しています。このコードで :JAIクローズファイルハンドルが早すぎますか?

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

は、Java 7で1箱にうまくいきましたが、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 

答えて

1

私の理論は、ガベージコレクションがで蹴ると何かを確定していることですそれはすべきではない。非常に奇妙な。それを次のように置き換えてください:

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

他の画像フォーマットにも該当するかわからない

関連する問題