【问题标题】:Connecting to XML file from jar file从 jar 文件连接到 XML 文件
【发布时间】:2013-02-26 09:56:00
【问题描述】:

我在哪里可以放置 XML 文件以使程序能够访问它,即使我为它生成了 jar 文件?

当我将 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)

为什么会出现这个错误以及如何纠正它?

【问题讨论】:

    标签: java


    【解决方案1】:

    由于您在更改文件内容后将文件保存回来,因此您很可能没有将其打包到 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]);
    

    编辑

    如果您想将 xml 打包到您的 jar 文件中,则可以使用 getResourceAsStream(String) 轻松完成读取 - 如另一篇文章中所述 - 以及 jar 内资源的限定名称如下:

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

    写回文件是可能的,但复杂且不鼓励,因为它有错误阅读更多herehere

    【讨论】:

    • 这两种方法都能成功,但是 xml 文件必须在 jar 文件的同一目录中,但我想要一种将 xml 文件放入 jar 文件中的方法。有没有办法做到这一点?提前致谢
    • 好的,当我使用 InputStream is = getResourceAsStream("com/my/pack/age/document.xml");我把 document.xml 文件放在哪里
    • 抱歉没有早点检查...你必须把 document.xml 放在包 com.my.pack.age 女巫意味着在文件系统上的目录 com/my/pack/agecom 直接在你的源文件夹,例如 C:\projects\MyProject\src\com\my\pack\age\document.xml
    【解决方案2】:

    使用 ClassLoader#getResourceAsStream 代替 FileInputStream 。 你可以在getResourceAsStream() vs FileInputStream找到类似的问题

    【讨论】:

      【解决方案3】:

      您必须以相对方式访问文件
      例如尝试一下

      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. 开发环境(来自 Eclipse)和
      2. 可运行环境(来自 Jar)

      【讨论】:

      • 感谢您的回答。它在 eclipse 上正常工作,但是当我制作 jar 文件时,它给了我同样的错误,我说
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2013-08-09
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多