即使我为它生成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 :(得分: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文件中打包xml,那么可以使用getResourceAsStream(String)轻松完成阅读 - 如另一篇文章中所述 - 以及jar中ressource的限定名称如下:
InputStream is = getResourceAsStream("com/my/pack/age/document.xml");
答案 1 :(得分:0)
使用ClassLoader#getResourceAsStream而不是FileInputStream。 您可以在getResourceAsStream() vs FileInputStream
中找到类似的问题答案 2 :(得分: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);
然后
您的应用程序将以两种方式访问该文件