2016-11-15 12 views
1

Java 클래스 중 일부에서는 인스턴스 변수로 선언 된 IO 리소스가 여러 메서드에서 사용되는 것을 볼 수 있습니다. 어떻게 닫을 수 있습니까? 몇 가지 제안 된 finalize() 및 그들은 또한 그것이 권장되지 않는다고 말한다. 이것에 대한 더 나은 접근 방법이 있는지 알 수 있습니까? 예는 :가까운 IO 리소스가 인스턴스 변수로 선언 된 경우 권장되는 방법은 무엇입니까

public class test{ 
     private PrintWriter writer=null; 
     public test(){ 
     createWriter(); 
} 
     public void log(){ 
     writer.write("test"); 
     writer.flush(); 
     } 
     public void createWriter(){ 
     writer=new PrintWriter(new BufferedWriter(new FileWriter("file"))); 
     } 
    } 
+4

을 닫습니다 다른 모든 Streams 및 Writers가 다른 Streams 및 Writer를 래핑하는 것과 마찬가지로 클래스를 Closeable로 구현하게하고 try-with-resources 문에서 자동으로 호출 할 수있는 close() 메서드를 갖습니다. 물론 문서화하십시오. –

+0

고마워요! 이 문제는 큰 코드 기반을 가진 기존 프로젝트에서 발생합니다. 객체가 생성되는 곳 어디에서나 변경 (try-with 추가)해야합니다. 그렇지 않으면이 설정을 변경하지 않고 닫을 수있는 다른 방법이 있습니다. 수업. – Saikiran

+0

try-with-resources 문을 사용하지 않아도됩니다. 대안은 finally 블록을 닫는 것입니다. 하지만 코드를 변경하지 않고 마술처럼 코드를 close() 할 수있는 방법은 없습니다. –

답변

0

소멸자의 어떤 종류가있을 수 갈까요. 예를 들어 junit (클래스 이름을 "test"로 지정할 때)에는 주석이 달린 메소드에서 정리 작업을 수행 할 @AfterClass 주석이 있습니다.

0

사용 후 수동으로 닫으면됩니다.

public class PrintWriterDemo { 
private PrintWriter writer; 
public PrintWriterDemo() { 
    writer = new PrintWriter(System.out); 
} 
public void log(String msg) { 
    writer.write(msg + "\n"); 
    writer.flush(); 
} 

public void close() { 
    System.out.println("print writer closed."); 
    writer.close(); 
} 

public static void main(String[] args) { 
    PrintWriterDemo demo = new PrintWriterDemo(); 
    demo.log("hello world"); 
    demo.close(); 
} 

}

1

클래스에서 구현합니다 AutoCloseableclose() 메소드를 오버라이드 (override)이 close() 방법으로 모든 IO 관련 자료를 닫습니다.

이제 Java 7을 사용하는 경우 자원을 사용하여 try를 사용하여 클래스에 대한 참조를 만들 수 있으며 JVM이 자동으로 클래스의 close 메소드를 호출합니다. 당신이

try(FileReader fr = new FileReader("filename")){ 
    // your code 
} 

를 작성하고 작업이 완료되는 경우

당신은 필터 처리 클래스의 코드에서 볼 수 있듯이,

public abstract class FilterReader extends Reader { 
    protected Reader in; 
    //......Other code, and then 
    public void close() throws IOException { 
     in.close(); 
    } 
} 

을 그리고 JVM이 자동으로 난 그냥 할 거라고 그것을