我有一个在我的应用程序中解析和编写的XML文件。在我的IDE(Eclipse)中,我只是这样解决它:
读:
private String xmlFile = "file.xml";
然后我构建文档:
doc = sax.build(xmlFile);
写作完成如下:
writer = new FileWriter("file.xml");
到目前为止运行良好,但在捆绑我的应用程序后,该文件不再可访问。 我究竟需要做什么才能从应用程序包中访问它? 我完全不熟悉类路径或我需要的任何东西,所以请放轻松我!
非常感谢!
答案 0 :(得分:2)
要读取文件,您可以按如下方式创建BufferedReader:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
getClass().getResourceAsStream("file.xml")));
您可以像以前一样编写文件,但要跟踪它的写入位置 - 如有必要,您可以从那里重新读取文件。
答案 1 :(得分:2)
彼得,
我遇到了类似的问题,因为你是新手,我将从这开始:当你在jar中打包文件时,它会被压缩,所以就像你在你的原始代码将无法正常工作,因为我们无法读取jar中压缩的文件。相反,您需要让Java将此资源作为一个流(正如许多其他人已经有用地指出的那样)将Java知道如何提供给您。
现在,实际上从那里输出文件是一件痛苦的事。这是我写回来的一些代码,这当然来自我发现的其他一些来源。根据需要填写例外情况! =)
InputStream in = null;
in = this.getClass().getResourceAsStream("/main.cc");
File outputFile = createMainOutputFile();
OutputStream out = null;
try {
out = new FileOutputStream(outputFile);
} catch (FileNotFoundException e) {
System.out.println(outputFile + " was not found!");
e.printStackTrace();
}
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
try {
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我们实际上必须一块一块地输出文件,我知道,我真的希望你希望做的工作!它会让生活变得更轻松。唯一可能令人困惑的是createMainOutputFile()调用,所以这里的代码也是......
private File createMainOutputFile() {
File directoryPath = new File(mainOutputFolder);
directoryPath.mkdirs();
File newFile = new File (mainOutputFolder + "main.cc");
try {
newFile.createNewFile();
} catch (IOException e) {
System.out.println("failed To create new file.");
e.printStackTrace();
}
return newFile;
}
最好的运气!
编辑:现在我注意到你实际上正在用XML解析器解析它,我会告诉你,如果你使用的是SAX解析器(至少是apache),你会发现它实际上会接受inputStream就像文件一样:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
try {
docBuilder = docFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//Here we supply the inputStream instead of the file...
doc = docBuilder.parse(inputStream);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Node xmlRoot = doc.getFirstChild();
答案 2 :(得分:1)
将该文件用作属性。你可以随心所欲地做任何事情。要访问它,请使用
Class.getResourceAsStream()
或等效方法。请查看此链接以获取一些提示:http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html?page=2
修改强>
我很遗憾地说我的建议不如我想象的那么好。我觉得我曾经做过一些你想做的事情,但我看了看应用程序,我所做的就是阅读文件。
我也做了一些googleing,并发现这个论坛条目有点陈旧,但考虑到Sun的部分缺乏进展,我认为它的本质仍然有效:http://lists.apple.com/archives/Java-dev/2003/Feb/msg00876.html
基本上,如果你想写一些东西,或者要求用户在启动之前提取jar,或者(我的建议)在jar所在的同一目录中创建一个目录,并将你的文件写入该目录。如果你真的需要,你甚至可以用该文件和原始jar的所有文件构建另一个jar,这当然会留下两个档案。
很抱歉带来你的希望。
答案 3 :(得分:1)
想象一下,你有一个名为myXmlDir的包将你的file.xml文件放在这个包下(实际上是一个目录)
请注意,此包与jar中的类打包在一起,可以通过classLoader访问。
请参阅此代码以返回输入流:
return SomeClass.class.getClassLoader().getResource("myXmlDir/file.xml").openStream();
你也可以,而不是openStream(),激活getFile()函数
答案 4 :(得分:1)
我无法发表评论,所以我的答案是指LES2的回答。诀窍是,如果要使用类加载器,则file.xml必须位于类路径中。
通常,如果它存在于JAR文件中,它将包含在类路径中。检查它是否存在,用7zip或任何其他zip程序打开jar。 如果文件不在jar中,则必须将其与jar一起发送,并在启动应用程序时手动将其添加到类路径中。
假设file.xml和jar在同一目录中。然后
java -cp .:myjar.jar com.example.Main
应该有帮助。
答案 5 :(得分:1)
这个常见问题的最佳选择: jar / war之外位置的绝对路径。
应用程序本身可以部署在任何地方,但主机应该有一个公共文件区域,例如“/ common / files / someApplication”
更好的是要有一个配置来指定(在构建期间或运行时)使用哪个路径。例如。 dev build将使用“/ dev / myprojects / someApplication”
不是很好的解决方案: 部署为爆炸战争文件。读写不是问题,但现在您已经导致部署依赖。
答案 6 :(得分:0)
您的输入应该是文件的绝对路径或相对路径....