2014-11-16 44 views
1

所以,我有一个读取文件数据的函数,在这种情况下,图像大小。但完成后它似乎不能正确释放这些文件。之后我无法移动这些文件。如果我不叫这个功能一切正常,但如果我做我总是得到“使用文件..等等等等等等”未在java中发布的资源

private void setMoveType() { 
    ImageInputStream in = null; 
    try { 
     in = ImageIO.createImageInputStream(new FileInputStream(file.toString())); 
     try { 
      final Iterator<ImageReader> readers = ImageIO.getImageReaders(in); 
      if(readers.hasNext()) { 
       ImageReader reader = readers.next(); 
       try { 
        reader.setInput(in); 
        try { 
         moveType = Helper.getMoveType(new Dimension(reader.getWidth(0), reader.getHeight(0))); 
        } catch (IOException e) { 
         System.err.println("IOException: " + e.getMessage()); 
         return; 
        } 
       } catch(Exception e) { 
        System.err.println("ReaderException: " + e.getMessage()); 
       } finally { 
        reader.dispose(); 
       } 
      } 
     } catch(Exception e) { 
      System.err.println("MoveTypeSetException: " + e.getMessage()); 
     } 
    } catch (IOException e) { 
     System.err.print("IOException: failure while creating image input stream"); 
     System.err.println(" -> createImageInputStream Error for file: " + file.getFileName()); 
     return; 
    } finally { 
     if(in != null) { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       System.err.println("IOException: " + e.getMessage()); 
       return; 
      } 
     } 
    } 
} 

编辑:ImageInputStream中的不正常关闭

EDIT2:一个FileInputStream没有关闭

+0

用[尝试 - 与资源(https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)语句。 – Tom

+0

@汤姆也没有运气。 – IntoDEV

回答

0

此流也都要被关闭:

new FileInputStream(file.toString()) 
+0

是的,发现第二个以前,谢谢。现在它工作 – IntoDEV

0

当你完成时关闭流应该工作(in.close())。操作系统可防止文件在使用时被更改,删除或移动。否则,该流将会变得混乱。关闭流会告诉操作系统不再使用该文件。

+0

好吧,出于某种原因,它并没有这样做。经过一些测试后,我确定它是没有正确关闭的ImageInputStream。 – IntoDEV

+0

你在代码的最后调用了'in.close()'吗?否则,操作系统无法确定您是否完成了该文件。 – FlyingPiMonster