2011-12-28 36 views
19

Có cách nào để kiểm tra xem liệu OutputStream có được đóng mà không cố ghi vào OutputStream và bắt giữ IOException không?Cách kiểm tra xem OutputStream có bị đóng không

Ví dụ, hãy xem xét các phương pháp giả tạo như sau:

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

bạn có thể thay thế /* stream isn't closed */ với gì?

+1

vấn đề cơ bản bạn cần phải giải quyết là gì? –

+1

Tôi nghi ngờ OP muốn tránh phải đối phó với các ngoại lệ. ;) –

+0

Nó đến từ tôi suy nghĩ phòng thủ về loại đầu vào xấu mà tôi có thể nhận được, nhưng đó là một câu hỏi giả định, cộng với kết quả google hàng đầu cho "java kiểm tra xem outputstream có bị đóng" điểm tới http: // stackoverflow hay không.com/questions/2607515/how-do-i-check-if-output-stream-of-a-socket-được-đóng mà dường như không thực sự trả lời câu hỏi đó – chrisbunney

Trả lời

19

Các dòng cơ bản có thể không biết nó đóng cửa của nó cho đến khi bạn cố gắng để viết thư cho nó (ví dụ nếu đầu kia của một socket đóng nó)

Phương pháp đơn giản nhất là sử dụng nó và xử lý những gì sẽ xảy ra nếu nó đóng cửa sau đó, thay vì thử nghiệm nó đầu tiên là tốt.

Không có vấn đề gì bạn kiểm tra, luôn có cơ hội bạn sẽ nhận được một IOException, vì vậy bạn không thể tránh được mã xử lý ngoại lệ. Việc thêm thử nghiệm này có thể làm phức tạp mã.

+0

Điều gì đặt câu trả lời này ngoài những người khác là biện minh cho không có một phương thức như 'isClosed()', _ ​​"Dòng cơ bản có thể không biết nó đóng cho đến khi bạn cố ghi vào nó" _, do đó được chấp nhận, cảm ơn :) – chrisbunney

+0

isClosed() là đúng sau khi bạn gọi đóng() vào cuối của bạn. Đây không phải là điều mà hầu hết mọi người muốn nó làm. ;) –

2

Bản thân OutputStream không hỗ trợ phương thức như vậy. Giao diện Closable được định nghĩa theo cách mà khi bạn gọi close(), bạn sẽ loại bỏ OutputStream đó.

Có thể bạn nên xem lại một chút thiết kế của ứng dụng và kiểm tra lý do tại sao bạn không làm điều đó và bạn kết thúc bằng một thể hiện OutputStream đã đóng vẫn chạy xung quanh trong ứng dụng của bạn.

1

No. Nếu bạn tự thực hiện, bạn có thể viết phương thức isClosed, nhưng nếu bạn không biết lớp bê tông thì không. OutputStream chỉ là một lớp trừu tượng. Dưới đây là cách triển khai:

/** 
* 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

Không phải 'OutputStream' là một lớp trừu tượng, do đó nó có thể cung cấp một số triển khai? – chrisbunney

+0

Vâng, xin lỗi, xấu của tôi. Nó không mặc dù. – Kylar

+1

Có, một sự xấu hổ nó không làm một cái gì đó như @ AlexR cho thấy trong câu trả lời của mình (http://stackoverflow.com/a/8655939/110255) – chrisbunney

8

Thật không may API OutputStream không có phương thức như isClosed().

Vì vậy, tôi chỉ biết một cách rõ ràng: tạo lớp học của bạn StatusKnowingOutputStream rằng kết thúc tốt đẹp bất kỳ dòng sản lượng khác và thực hiện các phương pháp close() của nó như sau:

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

Bây giờ thêm phương pháp isClosed()

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

Tuy nhiên điều này sẽ không bao giờ được yêu cầu trong bất kỳ ứng dụng. Nếu mã của riêng bạn đóng luồng - thì nó cũng sẽ xử lý trạng thái của nó (đóng/mở). Tuy nhiên, nếu bạn thu hút luồng từ một số thư viện của bên thứ ba - nó sẽ cung cấp một số phương thức 'boolean canIUseTheStream()'. – bezmax

+0

@bezmax, có thể hơi khó xử lý trạng thái của nó, giả sử bạn muốn đóng nó trong phương thức kinh doanh của mình (bạn cần đóng nó để gửi nó ở nơi khác) nhưng bạn cũng cần nó được xử lý trong một ' cuối cùng' khoản, để có nó đóng cửa khi một ngoại lệ xảy ra. –

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; 
} 

Điều này chỉ có thể cho một FileOutputStream!

-2

bằng cách sử dụng out.checkError()

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

tìm thấy nó ở đây: How do I get java to exit when piped to head

+1

Điều đó có thể làm việc cho System.out ** PrintStream **, và trên thực tế hoạt động trên bất kỳ PrintStream nào, nhưng không hoạt động trên OutputStreams nói chung. – IceArdor

Các vấn đề liên quan