在jar文件外创建并读取xml文件

时间:2012-07-18 04:15:14

标签: java file-io jar

我最近一直在问很多,我的所有帖子都是关于同样的问题,但是在不同的阶段和不同的可能答案(因为具体问题与前一个不同,但密切相关)。所以,如果看起来我正在重复我的问题,我很抱歉。事实上,我不是。我一直在谷歌和这里搜索,但没有一个答案似乎解决了我的问题,或者我弄错了。

好吧,我的文件层次结构是:

+ MyGame
  + build.xml
  + src
  + ThisIsWhereEclipsePutsTheXMLFile
  + build
    + manyFoldersWithClassFiles
    + aSpecialFolderWhereTheEntryPointIs

    + ThisIsWhereIWantMyXMLfileToBe.xml
    + game.jar

我的问题基本上是这样的:我的程序应该将它的状态保存到文件中,然后读取该文件。此文件应位于同一文件夹中的.jar文件(只有一个)之外。该文件可以存在与否。如果它存在,它应该覆盖它。

在我之前的问题中,我询问了how to read an xml file that's in the same directory。当我在Eclipse中使用它时,我得到的答案实际上解决了我的问题。

但是我需要用我的整个程序创建一个.jar文件,每当我要求它执行时我都需要我的程序来创建这样的xml文件。

我的save()是这样的,当我在Eclipse上运行它时它似乎正在工作,但是当我运行它执行我的.jar文件时它将无法工作:

public void save(Game game) throws IOException{
    Document doc = DocumentHelper.createDocument();
    doc.add(game.save());
    File save=null;
    save = new File("save.xml");

    FileWriter writer = new FileWriter(save);
    doc.write( writer);
    writer.close();
}

这就是我从文件中获取信息的方式:

public Game getinfofromxml() throws IOException{
    Game game;
    SAXReader reader = new SAXReader();
    try{
        URL fileWithData= new File( "save.xml" ).toURI().toURL();
        Document document = reader.read(fileWithData);
        Element alreadySavedGame= document.getRootElement();
        game= getGameSaved(alreadySavedGame);
    }catch(DocumentException ex){
        throw new IOException();
    }
    return game;
} 

同样,这可以从Eclipse中运行,但是当我从我的jar文件中运行它时,这将不起作用。从Eclipse开始,xml文件在MyGame文件夹中创建,但不在我拥有.jar的文件夹中。当我执行我的.jar时,根本就没有创建XML。

现在,我一直在读这可能与类路径有关。那么,让我告诉你我是如何编译的:

1)我运行Ant,它生成构建目录。它不会自动创建.jar。 2)我创建了Manifest.txt文件,我在其中写道:

 Main-Class: aSpecialFolderWhereTheEntryPointIs.MyMainClass
 Class-Path: .

3)我在cmd上创建.jar文件:      jar cfm myGame.jar Manifest.txt *

所以,我不认为我在那里犯了太多错误......

五月蚂蚁与它有关系吗? 任何的想法? 先谢谢(对不起我的英文)

2 个答案:

答案 0 :(得分:4)

停止考虑'当前目录'并输入配置。 user.home中讨论的{{1}} {很长一段时间,OS制造商一直告诉我们来配置。应用程序目录中的设置。

另见this answer“java程序如何使用jar中的文件进行读写?”了解更多提示。

答案 1 :(得分:1)

您编写和读取文件的方式是使用当前启动目录的相对路径...这取决于您启动jvm的位置以及您希望它写入和读取文件的位置。