3

我有一个小程序,需要打开一个文件流。该文件是一个本地文件,位于 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");

是否有另一种选择来解决这个问题而不使用完整路径?

4

1 回答 1

2

也许你可以getDocumentBase改用。取决于您的设置结构,代码库和文档之间是否存在密切关系。没有永久解决方案:getDocumentBase根据错误 #8019177在 7u40 中以相同的方式进行了修改。

如果没有,那么您可以尝试使用getResource从您的 JAR 中获取 URL,例如小程序的类文件,然后反汇编该 URL 以获取 JAR 的位置,从而获取代码库。这是未经测试的,所以如果你尝试过,请随时编辑这篇文章。

最后但同样重要的是,由于该更改仅影响本地小程序,您可以运行(本地或公共)Web 服务器来服务该小程序。

如果您想对此发表更正式的声明,我将引用#8017250 错误报告

如果小程序需要加载资源:

  • 如果资源在 applet JAR(s) 中,他们应该能够ClassLoader.getResoruceAsStream直接加载它,而不需要代码库信息。
  • 如果资源在任意位置,而不是在 applet JAR 中,他们应该有其他方法可以到达该位置,因为它不是 applet 资源的一部分。(例如 user.homejava 系统属性,前提是他们的小程序拥有所有权限)

http://www.duckware.com/tech/java-security-clusterfuck.html(感谢这篇文章)提到了一些其他的选择。受未来 Oracle 修改影响的可能性最小的是location.href在包含 HTML 页面中的使用,例如<applet>从 JavaScript 编写标签。

于 2013-09-02T10:27:33.710 回答