2014-05-09 8 views
0

나는 한 번씩 이미지를 다시로드하는 응용 프로그램을 만들고 있습니다. 외부에서 바꿀 수 있도록 그 작업을했습니다. ImageIO.read (path)를 사용하여 이미지 파일을 읽습니다.자바 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

어떤 OS입니까? 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 (새 파일 (ref))', 고마워! –

답변

0

Windows에서 (나는 Paint.NET을 사용하는 것처럼 당신이 Windows에 있다고 가정합니다.) 파일을 잡고 있으면 다른 응용 프로그램이 같은 파일에 쓰지 못하게되므로 특히 문제가됩니다. 대부분이 문제가 발생합니다.

당신이 여기처럼 당신이 스트림을 열

는 :
new FileInputStream(ref); 

당신은 기본 파일 포인터를 취득. 사용 후 파일 포인터를 해제하려면 다시 닫아야합니다. 자, ImageIO.read(InputStream) 스트림을 닫아야하지만 특정 경우 및 특정 버전의 Java에서는 이에 관련된 버그가 있습니다. 스트림이 제대로 닫히지 않으면 Java 프로세스는 종료 될 때까지 최악의 경우로이 파일 포인터를 유지합니다.
BufferedImage image = ImageIO.read(new File(ref)); 

그런 다음 ImageIO 항상 스트림의 개폐 처리됩니다 :

좋은 소식은, 당신은 단순히 코드를 변경하는 경우이다.