0

我正在尝试以编程方式设置系统属性“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:\folder%20name\security.policy”。

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

在 Windows 上,写入文件名而不转义空格是可行的。

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

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

我查看了 Java 文档中的 File 函数,该函数返回适用于任何平台的“System.setProperty”兼容路径名。我还尝试了 toURI().toString() 之类的方法,但无济于事。

有没有一种优雅的方法可以从 1 行代码中的文件引用中获取工作文件路径字符串?

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

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

我需要一个相对路径,所以我使用了 getResource 小技巧,它恰好返回一个 URL,带有讨厌的 %20 转义。既然我知道问题出在哪里,我就可以使用 URLDecoder 将它们剥离。但是有没有更不容易出错的方法?

4

1 回答 1

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));
于 2013-07-02T16:44:39.273 回答