2012-04-16 798 views
4

找到相对于Java应用程序“安装”的文件夹的路径的最佳方式是什么?Java FileOutputStream:相对于程序文件夹的路径?

我有一个静态方法的类:public static void saveToFile(String fileName)

当我把它叫做绝对路径,它的工作原理,但我真正想要的是在应用程序从运行到相对路径和文件夹。

我还没有部署我的应用程序,但现在我想找到一个相对于(Netbeans)项目根目录和被调用数据中的文件夹的路径:ProjectName \ data \ file.dat。我应该使用File课程还是将其制作成URI或其他?

请注意,我更喜欢它是独立于系统的,并且在部署应用程序时仍然可以工作。最终(相对)路径名将存储在属性文件中。

对不起,如果这个问题是重复的,任何帮助表示赞赏。

回答

3

什么找到相对于java应用程序“安装”的文件夹的路径的最佳方法?

OS厂商一直说很长一段时间保存在应用程序目录中的文件。取而代之的是将File置于user.homesub-directory。用户主页是应该可以建立可以读取或写入的文件对象的地方。这也是一个可以在整个运行过程中重现的地方,也是独立于平台的地方。

请注意,我更喜欢它是系统无关的,并且如果部署应用程序仍然可以工作。 ..这是一个简单的Java Swing应用程序..

然后你应该看看的一个部署选项是Java Web Start。它不仅使最终用户轻松安装(单击链接&确定提示),但它也提供PersistenceService来存储少量数据。这是一个小的demo. of the PersistenceService

如果用例需要存储大量数据,持久性服务将不适合数据本身,但可以将(绝对)路径存储到实际数据存储的任何位置。这样,您可能会有默认指向user.home的路径,但是如果用户选择其他位置,请使用持久性服务存储该位置。

一个应用程序。使用JWS启动默认情况下具有安全沙箱。要写入本地文件系统需要放松沙箱。这需要开发人员对应用程序的Jars进行数字签名。 &请求all-permissions在启动文件中,并且让用户在提示时接受签名代码。

另一方面。 Sun前段时间决定使用保护域来查找缓存Jars的位置是一种安全风险。因此,他们决定返回的信息总是指向服务器,对于两个小程序& JWS应用程序。或者换句话说,即使应用程序,保护域也不会指向本地文件系统。被本地缓存。

+0

感谢您的时间和明确的答案。 – MarioDS 2012-04-16 19:44:31

0

查找当前工作目录的相对路径,如new File(".")

如果你想知道当前工作目录的绝对路径,你可以写new File(".").getAbsolutePath()或File(“。”)。getAbsoluteFile()`。

我希望这能回答你的问题。如果我没有正确理解你,我很抱歉。

+0

您的理解不正确。他希望程序路径,而不是工作目录。 – j13r 2012-04-16 18:23:40

+0

我尝试了使用'“。” + File.separator +“data”+ File.separator +“file.dat”'它不起作用... – MarioDS 2012-04-16 18:26:42

+0

好吧我试着用File来打印绝对路径,它的**绝对正确**并且它没有工作......它根据需要返回'C:\ blah \ projectName \ data \ file.dat' ... – MarioDS 2012-04-16 18:34:42

2

如果你作为一个罐子部署,它可以得到的jar文件名和路径当前代码工作像这样:

new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 

(从How to get the path of a running JAR file?

+0

如果我在netbeans中运行我的项目,这项工作是否会完成? – MarioDS 2012-04-16 18:34:06

+0

可能。试试看。 – j13r 2012-04-16 19:44:12

+0

非常有用。谢谢 – jmcg 2016-04-21 03:15:57

1

在这里你去:

String path = System.getProperty("user.dir"); 
0

要得到一个文件的绝对路径使用新的文件()getCanonicalFile()。

new FileOutputStream(new File(".\\target\\dataset.xml").getCanonicalFile())