Java:数据文件的相对路径

时间:2012-11-19 07:48:10

标签: java file netbeans

我在Mac(OS版本10.6.8)上的NetBeans(v.7.2.1)中开发了一个GUI应用程序。此应用程序需要一个XML文件(包含程序使用的数据),我想将其放在子目录data中。

问题是如果我想从NetBeans中运行我的应用程序,那么这个数据目录必须放在主项目目录中;但是,如果我想简单地运行位于主目录的.jar子目录中的dist文件(使用双击),我必须将数据文件夹移动到dist - 并且然后程序将不再从NetBeans中运行。

这是在程序中指定数据文件路径的方式:

public String vocabPath = "data" + File.separator + "wordlist.xml";
public File vocabFile = new File(vocabPath);

起初这本身似乎没有问题,因为对于应用程序的重新分发,我认为我可以简单地将数据目录移动到dist,并分发它(在OS X和Windows 7上运行良好) );但是,在Ubuntu上我收到一条错误消息,说没有找到数据文件。

我是Java的新手,所以也许这是一个愚蠢的问题,但无论如何:我怎样才能使我的应用程序始终访问位于MAIN_DIR/dist/data的数据文件?或者如果问题的根源在其他地方,请告诉我。

提前多多感谢!

修改

我发布了一个follow-up question,因为我认为我已经将问题缩小到了一些只在Ubuntu下发生的意外行为。

编辑2

我后续问题的答案(参见第一次编辑)已经解决了我的问题(正如那些在试图解决类似我的问题时发现这篇文章的人的注释)。

2 个答案:

答案 0 :(得分:1)

如果文件wordlist.xml无法由用户修改,您可以将其作为jar的一部分包含在内,并使用getResourceAsStream()加载它。其他一些细节请见getResourceAsStream() vs FileInputStream

如果预计数据会被修改,您可以将其保留在某个已知位置。 Users home directory可通过user.home媒体资源获取。 (可能是一个很好的区域)

如果是由java命令启动的纯java程序,则拥有相对于'installation'(MAIN_DIR)的文件会更加困难。您可以创建可执行文件并使用某些操作系统api(Linux上为readlink ("/proc/self/exe", ..))来解析安装位置。

使用本机可执行文件打包java程序可以通过exe4j等软件完成。

(Launch4J是一个具有类似功能的开源解决方案,在这里可能很有用)

(为了完成和将来的参考)。您还可以尝试在Linux上的Windows和shell脚本上创建一个小批量脚本。可以从两者中检测安装区域。

bat - 请参阅%~dp0% - Directory navigation in command prompts bash - Getting the source directory of a Bash script from within

答案 1 :(得分:0)

我会保留文件的系统属性,并默认保留dist的路径。如果data中的文件存在于开发环境中,则应用程序会将其选中,否则它将始终为dist选择文件。

你可以这样做:

// This would pick up system property if set otherwise default value provided.
String filePath = (String) System.getProperty("VOCAB_FILE_PATH","<<path with dist>>"); 
public File vocabFile = new File(filePath);

在NetBeans环境中,只需设置一个系统属性VOCAB_FILE_PATH,其路径为data