[英]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.