将java.security.policy属性设置为跨平台文件路径

时间:2012-08-15 14:50:40

标签: java

我正在尝试以编程方式设置系统属性“java.security.policy”。

只要安全策略文件的路径没有空格,它就可以工作。

File myFileReference = new File("C:\folder_name\security.policy")
System.setProperty("java.security.policy", myFileReference.getAbsolutePath());
System.setSecurityManager(new RMISecurityManager());

如果文件路径中有空格,则它们会以%20进行转义,就像这样 “C:\文件夹%20name \ security.policy”。

上面的代码执行正常,但所有安全检查都失败了。我假设setProperty并没有真正找到该文件。

在Windows上,编写文件名而不用为空格转义。

System.setProperty("java.security.policy", "C:\\some folder\\wideopen.policy");

所以,问题似乎是%20空间逃逸。我可以使用正则表达式替换它,但也许这会使它在Windows上运行,并在其他地方失败。 另外,我不想像这样对文件路径进行硬编码。

我在Java文档中查看了一个File函数,该函数返回一个可在任何平台上运行的“System.setProperty”兼容路径名。我也试过像toURI()。toString()这样的东西,但没有用。

是否有一种优雅的方法可以从一行代码中的File引用获取工作文件路径String?

编辑: 这是简化的代码,我像这样构建文件

URL policyURL = Class.class.getResource("/sub local folder/wideopen.policy");
new File(policyURL.getFile())

我需要一个相对路径,所以我使用了那个小的getResource技巧,它恰好返回一个带有令人讨厌的%20转义的URL。 我现在可以使用URLDecoder去掉它们,因为我知道问题是什么。 但是,是否存在一种不易出错的方式?

1 个答案:

答案 0 :(得分:1)

我使用URLDecoder类解决了。以下是我尝试做的完整示例,以及使其有效的解决方案。

//here is the trick
URL policyFileURL = Class.class.getResource("/server/model/easy.policy");
String policyFilePath = "";
try {
    policyFilePath = URLDecoder.decode(policyFileURL.getFile(), "UTF-8");
}
catch (UnsupportedEncodingException e) {}

//here what I wanted to do (now it works)
server.activate(port, new File(policyFilePath));