从Java应用程序包读取/写入XML文件

时间:2010-05-04 17:52:15

标签: java xml jar

我有一个在我的应用程序中解析和编写的XML文件。在我的IDE(Eclipse)中,我只是这样解决它:

读:

private String xmlFile = "file.xml";

然后我构建文档:

doc = sax.build(xmlFile);

写作完成如下:

writer = new FileWriter("file.xml");

到目前为止运行良好,但在捆绑我的应用程序后,该文件不再可访问。 我究竟需要做什么才能从应用程序包中访问它? 我完全不熟悉类路径或我需要的任何东西,所以请放轻松我!

非常感谢!

7 个答案:

答案 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)

您的输入应该是文件的绝对路径或相对路径....