2013-02-26 89 views
2

從哪裏可以放置XML文件以使程序能夠訪問它,即使我爲它生成了jar文件?從jar文件連接到XML文件

當我把在項目中的XML文件,文件成功運行如下面的代碼的程序:

public class one { 

public final static void main(String[] args) throws Exception { 

    FileInputStream file = new java.io.FileInputStream("document.xml");//i put document.xml in project file 
    javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance(); 
    dbf.setCoalescing(true); 
    javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); 
    org.w3c.dom.Document doc = db.parse(file); 

    one obj = new one(); 
    obj.changeValue(doc, "192837465", "192837465"); 
    obj.save("document.xml",doc); 
} 

public void changeValue(org.w3c.dom.Document doc, String oldValue, String NewValue) throws Exception{ 
    org.w3c.dom.Element root = doc.getDocumentElement(); 
    org.w3c.dom.NodeList childNodes = root.getElementsByTagName("Employee"); 
    for (int i = 0; i < childNodes.getLength(); i++) { 
    org.w3c.dom.NodeList subChildNodes = childNodes.item(i).getChildNodes(); 
    for (int j = 0; j < subChildNodes.getLength(); j++) { 
     try { 
     if (subChildNodes.item(j).getTextContent().equals(oldValue)) { 
      subChildNodes.item(j).setTextContent(NewValue); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    } 
} 

public void save(String url ,org.w3c.dom.Document doc) throws Exception { 

    javax.xml.transform.TransformerFactory factory1 = javax.xml.transform.TransformerFactory.newInstance(); 
    javax.xml.transform.Transformer transformer = factory1.newTransformer(); 
    transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes"); 
    java.io.StringWriter writer = new java.io.StringWriter(); 
    javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(writer); 
    javax.xml.transform.dom.DOMSource source = new javax.xml.transform.dom.DOMSource(doc); 
    transformer.transform(source, result); 
    String s = writer.toString(); 
    System.out.println(s); 

    java.io.FileWriter fileWriter = new java.io.FileWriter(url); 
    java.io.BufferedWriter bufferedWriter = new java.io.BufferedWriter(fileWriter); 

    bufferedWriter.write(s); 

    bufferedWriter.flush(); 
    bufferedWriter.close(); 
} 
} 

但是當我使用eclipse使程序在jar文件,並使用該運行從命令提示符的文件命令:

java -jar xml.jar 

它給了我這樣的例外:

Exception in thread "main" java.io.FileNotFoundException: document.xml (The system cannot find the file specified) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     at one.main(one.java:13) 

爲什麼這個錯誤以及如何糾正它?

回答

0

類似的問題,必須訪問該文件以相對方式
例如嘗試

InputStream file = Thread.currentThread().getContextClassLoader() 
        .getResourceAsStream("document.xml"); 

而不是

String fileLocation = "src/document.xml"; 
File xmlFile = new File(fileLocation); 
FileInputStream file = new java.io.FileInputStream(xmlFile); 

然後
你的應用程序將訪問該文件在兩種方式

  1. Delopment環境(在Eclipse)和
  2. 可運行環境(從罐)
+1

感謝您的回答。它工作在日食正常,但當我做的jar文件它給了我同樣的錯誤,我說 – 2013-02-26 14:39:06

2

因爲您換款的內容更容易,你不收拾它在XML內後保存文件回來。 jar,但你把它作爲單獨的文件放在文件系統上。使用FileInputStream file = new java.io.FileInputStream("document.xml");來訪問文件,它可以在相同的工作目錄中用於命令java -jar xml.jar

這將工作

- mydir\ 
    - xml.jar 
    - document.xml 

這不會

- mydir\ 
    - xml.jar 
    - subdir\ 
     - document.xml 

避免這一切的麻煩我不建議你硬編碼的文件名在Java類,但它作爲參數傳遞你的主類

java -jar xml.jar document.xml 

java -jar xml.jar C:\somedir\somesubdir\document.xml 

和訪問如下:

FileInputStream file = new java.io.FileInputStream(args[0]); 

編輯

如果你想收拾你的jar文件,然後閱讀使用getResourceAsStream(String)輕鬆完成內部的XML - 作爲另一提到的後 - 以及罐內資源的合格名稱如下:

InputStream is = getResourceAsStream("com/my/pack/age/document.xml"); 

寫回文件是可能的,但複雜和氣餒,因爲它是越野車閱讀更多herehere

+0

謝謝你的回答 – 2013-02-26 13:47:05

+0

兩種方式成功的工作,但XML文件必須在jar文件相同的目錄,但我想要的方式將xml文件放入jar文件中。有沒有辦法做到這一點?在此先感謝 – 2013-02-26 13:55:05

+0

好吧,當我使用InputStream is = getResourceAsStream(「com/my/pack/age/document.xml」); 其中我把document.xml文件 – 2013-02-26 18:47:18