代码之家  ›  专栏  ›  技术社区  ›  user3921104

线程“main”java.lang.IllegalArgumentException:URI不是层次结构

  •  2
  • user3921104  · 技术社区  · 9 年前

    我见过类似的问题,但不知道如何解决。我已尝试将其更改为输入流

    public List<String> mergeInputData(List<String> s){
    
        List<String> mergedInputData = new ArrayList<String>();
        for (String string : s) {
            Enumeration<URL> en = getClass().getClassLoader().getResources(
                    string);
            if (en.hasMoreElements()) {
                URL metaInf = en.nextElement();
                try (BufferedReader br = new BufferedReader(new FileReader(
                        new File(metaInf.toURI())))) {
                    String line = "";
                    while ((line = br.readLine()) != null) {
                        if (line.length() > 0)
                            mergedInputData.add(line.trim());
                    }
                } catch (URISyntaxException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            }
        }
    
        return mergedInputData;
    }
    

    上面,字符串只包含文件名(比如egample.txt),例如我正在尝试读取egample.txt。

    不过它是从日食开始运行的。请建议我如何修复它。我看过其他答案,但不确定。

    folder structure

    1 回复  |  直到 9 年前
        1
  •  0
  •   Stephen C    9 年前

    问题发生在这里:

        new File(metaInf.toURI())
    

    如果您查看javadoc File(URI) 构造函数,它表示:

    通过转换给定的 file: URI转换为抽象路径名。

    问题是 getResources() 枚举器是 典型的 文件: URL。如果您的代码是从JAR文件执行的,或者如果类路径上有其他JAR文件,那么您可以获得 jar: URL。这个 File 构造函数无法处理它们……因为URL不使用主机文件系统中的路径名命名。

    在某些情况下,这将是结局。然而,在你的情况下,你实际上不需要使用 文件 。相反,您应该能够这样做:

        BufferedReader br = new BufferedReader(
               new InputStreamReader(metaInf.openStream()));
    

    它在Eclipse中运行的原因是,在这种情况下,URL将 文件: URL。可以直接从相应的Eclipse工作区目录访问资源。