簡體   English   中英

從公共方法返回InputStream

[英]Returning an InputStream from a public method

我有一個類,一方面,從公共方法返回一個InputStream是正確的,例如

public class MyClass {

    private File _file;

    ...

    public InputStream getInputStream() {
        return new FileInputStream( _file );
    }
}

但是,我對這樣做也非常謹慎,因為它讓調用者有責任關閉這個流。 我有什么方法可以避免這個問題?

取決於為什么這是你眼中的問題。 如果你絕對必須返回一個InputStream並且有問題的文件不是太大,你可以將整個文件緩沖到一個字節數組中,關閉原始流並return new ByteArrayInputStream(buf) 關閉ByteArrayInputStream不是必需的(實際上沒有效果)。

但是,如果返回一個InputStream “感覺正確”,那么調用者是否應該期待一個InputStream並且所有這一切都沒有意義,包括完成時關閉流的必要性?

返回InputStream本質上不是一件壞事。 現在,如果您希望調用者訪問數據而不負責關閉資源,您可以這樣做:

interface InputReader {
    void readInput(InputStream is);
}
public class MyClass {
    void feed(InputReader ir){
       try(InputStream is=new FileInputStream( _file )){
          ir.readInput(is);
       }
    }
}

調用者指定一個InputReader實例,它將接收可關閉的資源作為參數,並且不再負責關閉它。

MyClass myClass = ... ; //Get the instance
myClass.feed( new InputReader() {
    @Override
    void readInput(InputStream is){
       ... ; // Use at will without closing
    }
});

應該考慮在將InputStream傳遞給InputReader之前修飾它,以便.close()拋出異常。

實際上,如果不了解關於課程的更多細節,你就無法做到。 您可以通過MyClass中的方法提供文件處理(這需要知道文件內容的含義)並在流為空時關閉流。 除此之外,該類的用戶負責此對象,您無法真正避免這種情況。 如果沒有析構函數的功能,就像在C ++中一樣,對於任何讓您離開類的范圍的對象,您都不能100%負責。

可以做的是在你的類上放一個close()方法,清除任何打開的文件處理程序,連接等,並要求類的用戶負責調用close() 有關如何使用finalize方法跟蹤調用者是否正確關閉您的類的一些討論,請參閱此問題

...因為它將調用者的責任放在關閉此流上。

是的,調用者負責處理返回的流的關閉操作。 由於您的方法無法跟蹤其返回的內容, 因此此任務完全屬於調用方 這種情況與使用例外之間有類比。 開發人員使用異常,因為API作者無法始終控制他們向我們呈現的內容。 我們必須小心,例如,當有可能將數字除以零時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM