2013-07-01 18 views
0

我有一個微不足道的Java問題。我有一個應該生成XML文件的函數。目前,我只是有一個函數的字符串返回類型。Java函數返回XML。

public String myXmlFile() 

我喜歡這種方法,因爲它給了我一個乾淨的api。

不要像這樣的方法,因爲如果xml變得太大,它會使我處於粘性位置。我知道我可以創建一個文件並從函數返回文件的處理程序。然而,創建一個文件給我增加了頭痛,因爲一旦我完成了這個文件,就必須記住刪除這個文件。這不是一件容易的事情,因爲使用XML的代碼並不是很簡單。這很複雜,而且會發生很大的變化。

因此,民意調查小組,看看是否有一個簡單的答案呢?

+0

你得到任何錯誤,而這樣做呢? – Ketan

+2

你能告訴我們你已經嘗試過的代碼嗎? –

回答

2

您可以通過將流式編寫器作爲輸入參數來避開此問題,這將允許用戶(調用API的應用程序)決定數據是否足夠小以適合內存,或者XML是如此之大,它需要進入一個文件。例如:

public void myXmlFile(OutputStream output); 

這使您的API變得簡單,並且允許您處理這兩種情況。

+0

是的。這將是明智的選擇之一。然而,我猜想這只是迂腐 - 在這種情況下,myXmlFile()函數可能會在內部調用某個其他函數(在不同的線程中),這會增加函數的客戶端嘗試讀取輸出流的情況,而助手/內部函數還在寫嗎? – partha

+0

呃,理論上是的,但是你真的必須走出自己的方式去創造這種情況......除非你沒有告訴我們你會打電話的複雜而且非常非常聰明的多線程環境這樣的功能。就我個人的觀點而言,這也會像目前爲止描述的那樣嚴重地濫用API。 – Steve

+0

我同意。你有一個公平的觀點。我想這是解決方案。謝謝。 :) – partha

0

您的方法可能需要一個OutputStream參數,然後您可以按字節寫入xml並在完成時關閉。

0

只有兩種方法。然後API的最終用戶可以決定使用哪種方法:

public String myXmlFileAsString(); 
public File myXmlFile(); 
0

一種想法是使用一個高速緩存解決方案(其可以決定是否將數據存儲在存儲器中或磁盤上),並以繞過高速緩存鍵而不是你的API中的XML內容。

通過這種方式,您可以配置例如您要使用的最大內存,並將剩餘的內存留給庫。

請參閱here瞭解可能性列表。

0

我不是Java中XML處理方面的專家,但爲什麼不研究Xerces是否具有必要的優化,並將優化和處理文件交給Xerces。然後你可以從你的方法中返回一個Xerces XMLString。 http://xerces.apache.org/xerces2-j/javadocs/xni/org/apache/xerces/xni/XMLString.html

Xerces有一些優化,例如,XMLString只是字符串子字符串的XML表示形式,它保存在掃描器的字符緩衝區中。但要小心,因爲這種模式(只保留邊界而不將子字符串複製到單獨的字符串中)有時會導致內存泄漏。 (請參閱Java7u21中字符串的更改。)

0

Java對於處理內置XML的廣泛支持,爲什麼要重新發明輪子?
創建DOM,使用javax.xml.transform包中的功能將其轉換爲StreamResult,然後將流傳輸到文件。
在最基本的,你會得到像下面這樣:

DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder documentBuilder = df.newDocumentBuilder(); 
    Document doc = documentBuilder.newDocument(); 
    Element root = doc.createElement("RootElement"); 
    doc.appendChild(root); 
    Element child = doc.createElement("ChildElement"); 
    child.setNodeValue("Hello World"); 
    root.appendChild(child); 

    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer = tf.newTransformer(); 
    File f = new File("c:\\temp\\dummy.xml"); 
    StreamResult resultStream = new StreamResult(f); 
    transformer.transform(new DOMSource(doc), resultStream);