我正在尝试以编程方式设置系统属性“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去掉它们,因为我知道问题是什么。 但是,是否存在一种不易出错的方式?
答案 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));