Java的最佳国际替代方案';s getClass().getResource()

Java的最佳国际替代方案';s getClass().getResource(),java,Java,我的Java应用程序捆绑了很多资源文件。这些文件的文件名包含国际字符,如u或æ。我想使用getClass().getResource()加载这些文件,但显然这不受支持,因为对于这些特定的文件名,getResource方法总是返回null 这使我尝试使用国际字符的URL编码,但正如所述,这也不受支持 因此,我的问题是:加载名称包含国际字符的资源的推荐方法是什么?例如,我需要加载一个名为Sjælland.txt的文件的UTF-8内容,但不确定是否存在一个最佳(它可能是最差的候选,因为这是一个相当复杂

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

这使我尝试使用国际字符的URL编码,但正如所述,这也不受支持


因此,我的问题是:加载名称包含国际字符的资源的推荐方法是什么?例如,我需要加载一个名为Sjælland.txt的文件的UTF-8内容,但不确定是否存在一个
最佳
(它可能是
最差
的候选,因为这是一个相当复杂的问题),但这似乎是一个可行的机制。它通过直接读取jar来避免使用
getResource

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
的文件,该文件成功地获取了条目。

我不确定我是否正确理解您的意思,但如果我尝试

URL url = Test.class.getResource("/Sjælland.txt");
Object o = url.getContent();
然后
o
是一个
sun.net.www.content.text.PlainTextInputStream


我正在Windows计算机上使用1.6。我已将(默认?)System.property sun.jnu.encoding设置为Cp1252。所以这一切似乎都很好。您发布的bug似乎是JDK1.4。它可能是您正在使用的。

这很有趣。我明白为什么会这样。然而,我认为要获得适当的性能需要做更多的工作,因为每次读取文件时都要打开一个压缩的jar。在走这条路之前,我会看看是否还有其他人可以分享。不,我使用的是Java版本:1.7.0_10-ea,Java供应商:Mac上的Oracle Corporation。这在使用苹果公司的Java1.6.x时可以正常工作。我将看一看编码——也许就是这样……我尝试使用UTF-8的sun.jnu.encoding设置,因为这个页面说这就是mac使用的:我还尝试使用Normalizer来分解文件名,这是mac文件系统中的自定义代码,行为:resourceUri=Normalizer.normalize(resourceUri,Normalizer.Form.NFD);但是,它仍然不起作用。如果我查找文件夹并使用Java.io列出它的文件,我会找到一个文件名Sj��lland.txt代码点的值是[83、106、65533、65533、108、108、97、110、100、46、116、120、116],所以“æ”以某种方式表示为两个字符。@RandahlFinkIsaksen我不知道你是否还读过这篇文章,但当Peter编辑我的答案时,我注意到了这个问题。您是否尝试将file.encoding系统属性(作为启动参数)设置为UTF-8?