2014-05-09 54 views
0

我正在研究每隔一段時間重新載入圖像的應用程序。 我做到了,所以我可以在外面進行更改。我正在使用ImageIO.read(路徑)來讀取圖像文件。Java ImageIO聲明圖像

現在,當我想用​​我的paint.NET更改圖像並嘗試保存(覆蓋)圖像時,paint.NET會引發IOException。這可能是因爲ImageIO在流程運行時聲稱圖像是他的。但這就是我的想法。

的代碼是在這裏:

public int width, height; 
public int[] pixels; 

public Sprite(String ref) { 
    try { 
     BufferedImage image = ImageIO.read(new FileInputStream(ref)); 
     width = image.getWidth(); 
     height = image.getHeight(); 
     pixels = new int[width * height]; 
     pixels = image.getRGB(0, 0, width, height, pixels, 0, width); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

任何人知道如何解決這一問題?

謝謝!

+0

哪個操作系統? http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7166379它似乎相當竊聽,http://stackoverflow.com/questions/19234572/memory-leak-in-java-imageio-read –

+0

這些錯誤僅針對OS X和Linux的Java 7,似乎可能與此無關。我認爲這個問題的解決方案實際上是微不足道的,請參閱下面的答案。 – haraldK

+0

'ImageIO.read(new File(ref))'工作,謝謝! –

回答

0

在Windows上(我假設你在Windows上,正如你提到你使用Paint.NET),保持一個文件是特別有問題的,因爲它會阻止其他應用程序寫入同一個文件。這很可能是你遇到的問題。

當你打開一個流,就像你在這裏做的:

new FileInputStream(ref); 

你獲得一個本地文件指針。您有責任在使用後再次關閉它以釋放文件指針。現在,ImageIO.read(InputStream)應該爲你關閉流,但在某些情況下和某些版本的Java中,存在與此相關的錯誤。如果流未正確關閉,則Java進程將保留該文件指針作爲最壞情況,直到Java進程終止。

好消息是,如果你只是你的代碼更改爲:

BufferedImage image = ImageIO.read(new File(ref)); 

然後ImageIO將始終以流的開啓和關閉的照顧。