工作完成后,不会删除ImageIO垃圾临时文件

时间:2016-10-18 14:57:31

标签: scala javax.imageio

我正在使用ImageIO将文件从JBIG2转换为JPEG,一切正常但ImageIO创建的临时文件没有被删除,并且卡在临时文件夹中。

例如:imageio1278573787994972734.tmp

  • 运行GC无济于事
  • 处理图像阅读器无济于事
  • 禁用缓存无法帮助

这将非常有效,我不想耗尽磁盘空间。

任何想法如何让他在完成后删除这些临时文件?

感谢。

以下是代码:

def convertJBig2ToJpeg(j2bigFile: File) : Try[File] = Try {
import java.io._
import net.java.truecommons.shed.ResourceLoan._
loan (new FileInputStream(j2bigFile)) to { inputStream =>
  val disf = new DefaultInputStreamFactory()
  val imageInputStream = disf.getInputStream(inputStream)
  val imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi())
  imageReader.setInput(imageInputStream)
  val param = imageReader.getDefaultReadParam
  val bufferedImage = imageReader.read(0, param)
  val newFilePath = j2bigFile.getParent + "/" + j2bigFile.getName.split('.')(0) + "." + MimeType.postfixValue(JPG)
  val newFile = new File(newFilePath)
  try {
    ImageIO.write(bufferedImage, MimeType.postfixValue(JPG), newFile)
  }catch {
    case e: Throwable =>
      Files.deleteIfExists(newFile.toPath)
      throw e
  }
  newFile
}}

1 个答案:

答案 0 :(得分:0)

如果您在阅读和写作后没有正确处理资源,就会发生这种情况。

遵循此处置策略以解决问题

这是Java语法。

处理读者

if(imageReader.getInput() != null && imageReader.getInput() instanceof ImageInputStream)            
  ((ImageInputStream)imageReader.getInput()).close();
imageReader.dispose();

处置作家

try {
     imageWriter.setOutput(out);
     imageWriter.write(null, new IIOImage(image, null, null), iwp);
     out.flush();
 } catch(IOException e) {                        
     imageWriter.abort();                    
     throw e;
 } finally {
     try {                           
         out.close();                            
     } catch(Exception inner) {                              
     }
     imageWriter.dispose();
 }

Scala中的代码

try {
     imageWriter.setOutput(out)
     imageWriter.write(null, new IIOImage(image, null, null), iwp)
     out.flush()
 } catch { 
   case e: IOException =>                        
     imageWriter.abort()                    
     throw e
   case _ => if (imageWriter != null) imageWriter.abort()
 } finally {
     try {                           
         out.close()                         
     } catch {
       case _ =>                              
     }
     imageWriter.dispose()
 }

有关详细信息,请访问this blog,其解释相同