2013-02-26 86 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