[英]Closing output stream via StreamResult
我正在開發一個Android應用程序,到目前為止一直很好,但是我有一個很小的打嗝讓我困擾。
在項目中,我正在使用XML文件,我將它們保存到Android設備的外部存儲中。 為此,我使用了TransformerFactory
和StreamResult
對象。
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer trans = transFactory.newTransformer();
DOMSource xmlSource = new DOMSource(xmlDoc);
StreamResult result = new StreamResult(Environment.getExternalStorageDirectory() + "/file.xml");
trans.transform(xmlSource, result);
result.getOutputStream().close();
所以,保存文件IS工作,但我result.getOutputStream().close();
的問題是,在最后一行, result.getOutputStream().close();
我得到一個Nullpointer異常。
所以我的一個非常簡單的問題: 流是否需要由我關閉,或者做一些關閉它的方法? 當我刪除最后一行時,它仍然保存文件並且完全沒有錯誤,我很滿意,但我不想讓任何流打開。
public OutputStream getOutputStream()
獲取使用setOutputStream設置的字節流。
返回:使用setOutputStream設置的字節流,如果未調用setOutputStream或ByteStream構造函數,則返回null。
在調用文件構造函數時,未設置字節流。 由於類描述和文件構造函數都沒有聲明您需要手動關閉任何內容,因此可以安全地假設您不需要執行任何操作。
編輯:這取決於您正在應用的變壓器,在您的情況下,您使用身份(輸出=輸入)變壓器。 在我的設置中,這是由com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl
實現的,它將關閉它打開的任何輸出流:(第760-767行)
// If we create an output stream for the Result, we need to close it after the transformation.
if (_ostream != null) {
try {
_ostream.close();
}
catch (IOException e) {}
_ostream = null;
}
如果你查看源代碼 ,你會發現該類只是一個簡單的bean,它只有3個字段: systemId
, outputStream
和writer
plus getter和setter。
所以基本上,只有當某人使用setter或相應的構造函數設置它們時,outputStream或writer才可用。
因為你將StreamResult
傳遞給Transformer
,顯然不清楚在StreamResult上實際執行了哪些修改,但我認為如果你沒有自己設置它們,那么它們最終會變為null,這就是你得到它的原因NPE。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.