簡體   English   中英

通過StreamResult關閉輸出流

[英]Closing output stream via StreamResult

我正在開發一個Android應用程序,到目前為止一直很好,但是我有一個很小的打嗝讓我困擾。

在項目中,我正在使用XML文件,我將它們保存到Android設備的外部存儲中。 為此,我使用了TransformerFactoryStreamResult對象。

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個字段: systemIdoutputStreamwriter plus getter和setter。

所以基本上,只有當某人使用setter或相應的構造函數設置它們時,outputStream或writer才可用。

因為你將StreamResult傳遞給Transformer ,顯然不清楚在StreamResult上實際執行了哪些修改,但我認為如果你沒有自己設置它們,那么它們最終會變為null,這就是你得到它的原因NPE。

暫無
暫無

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

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