【问题标题】:Create and read an xml file outside jar file在 jar 文件之外创建和读取 xml 文件
【发布时间】:2012-07-18 04:15:13
【问题描述】:

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

嗯,我的文件层次结构是:

+ 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 *

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

蚂蚁可能与它有关吗? 任何想法? 预先感谢(对不起我的英语)

【问题讨论】:

    标签: java file-io jar


    【解决方案1】:

    停止考虑“当前目录”并放置配置。在user.home 中,如this answer 中所述。很长一段时间以来,操作系统制造商一直在告诉我们不要放置配置。应用程序目录中的设置。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,一般来说,您可能应该使用绝对路径来控制您希望文件的位置。您可以允许用户通过属性或其他方式控制此路径。
      • 如果我双击 .jar 文件.. jvm 不是在那个目录中启动的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 2015-08-20
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多