java - 从 jar 文件连接到 XML 文件

标签 java

我可以将 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):

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)

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

最佳答案

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

关于java - 从 jar 文件连接到 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15086020/

相关文章:

java - 在 mongoDB 中存储 java 8 LocalDate

java - 为什么使用 CachingParanamer 时 Paranamer 不返回方法名称?

java - urlconnection javax.net.ssl.SSLException : java. lang.IllegalStateException

java - 如何使用 Jackson 和默认类型对 EnumMap 进行(反)序列化?

java - Android 按钮变为可见时不可点击

java - 读取和写入集合

java - 静态变量什么时候被垃圾回收?

java - 读取字符串作为对变量的引用

java - 使用枚举中实现 "Listeners"的类

java - 如何处理 CompletableFuture 链中的错误响应?