7

我的 Java 应用程序捆绑了很多资源文件。这些文件的文件名包含国际字符,如 ü 或 æ。我想使用 getClass().getResource() 加载这些文件,但显然这不受支持,因为对于这些特定的文件名,getResource 方法总是返回 null。

这让我尝试使用国际字符的 URL 编码,但正如http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4968789所述,这也不支持。

所以,我的问题是:加载名称包含国际字符的资源的推荐方法是什么?例如,我需要加载名为 Sjælland.txt 的文件的 UTF-8 内容

4

2 回答 2

3

不确定是否有best(它可能是一个候选者,worst因为它是一个相当黑客),但这似乎是一个有能力的机制。getResource它通过直接读取 jar来回避使用的需要。

public class NavelGazing {
  public static void main(String[] args) throws Throwable {
    // Do a little navel gazing.
    java.net.URL codeBase = NavelGazing.class.getProtectionDomain().getCodeSource().getLocation();
    // Must be a jar.
    if (codeBase.getPath().endsWith(".jar")) {
      // Open it.
      java.util.jar.JarInputStream jin = new java.util.jar.JarInputStream(codeBase.openStream());
      // Walk the entries.
      ZipEntry entry;
      while ((entry = jin.getNextEntry()) != null ) {
        System.out.println("Entry: "+entry.getName());
      }
    }

  }
}

我添加了一个名为的文件Sjælland.txt,这确实成功获取了条目。

于 2012-10-22T16:18:47.870 回答
0

我不确定我是否正确理解你,但如果我尝试

URL url = Test.class.getResource("/Sjælland.txt");
Object o = url.getContent();

然后o是一个sun.net.www.content.text.PlainTextInputStream

我在 Windows 机器上使用JDK 1.6。我已经(默认?) System.property sun.jnu.encoding 设置为 Cp1252。所以这一切似乎都很好。您发布的错误似乎是 JDK 1.4。这可能是你正在使用的。

于 2012-10-23T07:12:12.877 回答