2011-12-28 2 views
19

OutputStream이 닫혀 있는지 확인하고 거기에 쓰려고 시도하지 않고 IOException을 잡으려고 시도하지 않았습니까?OutputStream이 닫혀 있는지 확인하는 방법

public boolean isStreamClosed(OutputStream out){ 
    if(/* stream isn't closed */){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

무엇 당신이 /* stream isn't closed */을 대체 할 수 :

예를 들어, 다음과 같은 인위적인 방법을 고려? 당신이 그것을 쓰기를 시도 할 때까지

+1

당신이 해결해야 할 기본 문제는 무엇입니까? –

+1

나는 OP가 예외 처리를 피하려고한다고 생각합니다. ;) –

+0

나는 어떤 종류의 나쁜 입력에 대해 방어 적으로 생각하고 있지만, 가상 스트림 질문과 "outputstream이 닫혀 있는지 여부를 확인하는 자바 확인"에 대한 최상위 결과가 http : // stackoverflow를 가리킨다.com/questions/2607515/what-do-i-check-if-output-the-socket-is-closed이 질문에 실제로 대답하지 않는 것 같습니다. – chrisbunney

답변

19

기본이되는 스트림은 그것의 폐쇄 알 수 없습니다 (예를 들어, 소켓의 다른 쪽 끝을 닫을 경우)

가장 간단한 방법은 그것을 사용하고 닫을 경우 발생하는 처리 할 수있다 그런 다음 먼저 테스트하는 것이 아닙니다.

테스트 할 때마다 IOException이 발생하기 때문에 예외 처리 코드를 피할 수는 없습니다. 이 테스트를 추가하면 코드가 복잡해질 수 있습니다.

+0

이 답변을 다른 사람들과 어떻게 구분합니까? 'isClosed()'와 같은 메소드가 없다는 이유, _ "기본 스트림은 쓸 때까지 닫히지 않을 수도 있습니다."_ 따라서 받아 들여지고 감사합니다 :) – chrisbunney

+0

호출 후 isClosed()는 true입니다. 당신의 끝에서 close(). 이것은 대부분의 사람들이하기를 원하는 것이 아닙니다. ;) –

2

OutputStream 자체는 이러한 메서드를 지원하지 않습니다. Closable 인터페이스는 일단 close()를 호출하면 해당 OutputStream을 삭제하는 방식으로 정의됩니다.

어플의 디자인을 약간 재검토하고 그 이유를 확인하고 응용 프로그램에서 여전히 실행중인 닫힌 OutputStream 인스턴스로 끝나야하는지 확인해야 할 수도 있습니다.

1

아니요. 사용자가 직접 구현 한 경우 isClosed 메소드를 작성할 수 있지만 구체적인 클래스를 모르는 경우에는 no입니다. OutputStream은 단지 추상 클래스이다.

/** 
* Closes this output stream and releases any system resources 
* associated with this stream. The general contract of <code>close</code> 
* is that it closes the output stream. A closed stream cannot perform 
* output operations and cannot be reopened. 
* <p> 
* The <code>close</code> method of <code>OutputStream</code> does nothing. 
* 
* @exception IOException if an I/O error occurs. 
*/ 
public void close() throws IOException { 
} 
+0

'OutputStream'은 추상 클래스가 아니므로 구현이 가능합니까? – chrisbunney

+0

예, 죄송합니다. 내 잘못입니다. 그것은하지 않습니다. – Kylar

+1

예, 부끄러운 일은 @AlexR과 같은 일을하지 않습니다. 그의 답변 (http://stackoverflow.com/a/8655939/110255) – chrisbunney

8

불행히도의 OutputStream의 API가 isClosed() 같은 방법이 없습니다 : 여기 구현의입니다.

그래서 나는 오직 하나의 분명한 방법을 알고 : 다른 출력 스트림을 래핑하고 다음과 같은 자사의 close() 메소드를 구현하는 클래스 StatusKnowingOutputStream 만들 :

public void close() { 
    out.close(); 
    closed = true; 
} 

이제 방법 추가를 isClosed()

public boolean isClosed() { 
    return closed; 
} 
+0

그러나 이것은 어떤 어플리케이션에서도 결코 요구되어서는 안됩니다. 자신의 코드가 스트림을 닫는 경우 - 또한 스트림의 상태를 처리해야합니다 (닫힌/열림). 그러나 일부 제 3의 파티 라이브러리에서 스트림을 얻는다면'boolean canIUseTheStream()'메소드를 제공해야합니다. – bezmax

+0

@bezmax, 그것의 상태를 처리하기가 좀 더 어려울 수도 있습니다. 비즈니스 메소드에서 닫으려는 경우 (다른 곳으로 보내기 위해 닫아야 할 필요가 있습니다) finally' 절을 사용하여 예외가 발생하면 닫습니다. –

2
public boolean isStreamClosed(FileOutputStream out){ 
    try { 
     FileChannel fc = out.getChannel(); 
     return fc.position() >= 0L; // This may throw a ClosedChannelException. 
    } catch (java.nio.channels.ClosedChannelException cce) { 
     return false; 
    } catch (IOException e) { 
    } 
    return true; 
} 

이것은 FileOutputStream에서만 가능합니다! out.checkError를 사용하여

-2

()

while(!System.out.checkError()) { 
    System.out.println('hi'); 
} 

여기에 그것을 발견 : How do I get java to exit when piped to head

+1

System.out ** PrintStream **에서 작동하며 실제로 모든 PrintStream에서 작동하지만 일반적으로 OutputStream에서는 작동하지 않습니다. – IceArdor

관련 문제