我有一个applet,需要打开一个文件流。此文件是位于applet和HTML文件所在位置的本地文件:
URL localURL = new URL(getCodeBase(), "pixs/icons.zip");
InputStream localInputStream =localURL.openStream();
它曾经工作正常,但在升级到java 1.7 build 25之后,getCodeBase()总是返回null。 这实际上是有记录的!唉 - 没有建议如何克服它。
一件有用的事情是使用完整路径:
URL localURL = new URL("file:c:/myFolder/pixs/icons.zip");
是否有其他选项可以在不使用完整路径的情况下解决此问题?
答案 0 :(得分:2)
也许您可以使用没有永久解决方案:getDocumentBase
代替。取决于您的设置结构,代码库和文档之间是否存在密切关系。getDocumentBase
在7u40中以相同的方式进行了修改,根据{{3} }。
如果没有,那么您可以尝试使用bug #8019177从您的JAR获取网址,例如applet的类文件,然后反汇编该URL以获取JAR的位置,从而得到代码库。这是未经测试的,因此如果您尝试这样做,请随时编辑此帖子。
最后但同样重要的是,由于该更改仅影响本地小程序,因此您可以运行(本地或公共)Web服务器来提供该小程序。
如果您想要更正式的声明,我会引用getResource
:
如果applet需要加载资源:
- 如果资源在applet JAR中,他们应该可以直接用the #8017250 bug report加载它,而不需要代码库信息。
- 如果资源位于仲裁位置,而不是applet JAR内部,则应该有其他方式到达该位置,因为它无论如何都不是applet资源的一部分。 (例如
user.home
java系统属性,前提是他们的applet具有所有权限)
ClassLoader.getResoruceAsStream
(感谢http://www.duckware.com/tech/java-security-clusterfuck.html)提到了其他一些选择。受到未来Oracle修改apprers影响的最不可能的是在包含HTML页面中使用location.href
,例如从JavaScript编写<applet>
标记。