在访问JAR文件时出现NotDirectoryException

时间:2016-04-27 21:29:08

标签: java jar filesystems

晚上好,

我正在尝试动态访问包含几个* .class文件的JAR文件。 我已经读过它,一个好方法是使用java类FileSystem访问jar中的几个文件。我写了以下代码:

private void loadJar(String gameName) {
        final String packageBinaryName = gameName;
        final String pathname = packageBinaryName.replace(".", "/") +".jar";
        URI uri = null;
        uri = new File(pathname).toURI();//.toURL();
        final String[] array = uri.toString().split("!");
        FileSystem fs = null;
        Path dir;

        try 
        {
            if(array.length == 2) 
            {
                final Map<String, String> env = new HashMap<>();
                fs = FileSystems.newFileSystem(URI.create(array[0]), env);
                dir = fs.getPath(array[1]);   
            } 
            else
                dir = Paths.get(uri);

            DirectoryStream<Path> stream;

            System.out.println(dir);
            stream = Files.newDirectoryStream(dir, "*.class");
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
}

但是我得到了一个java.nio.file.NotDirectoryException

JAR文件存在,它指向写入路径。可能导致这个问题的原因是什么?

dir打印以下内容:

C:\Users\afonso\workspace\GameEvaluatorDummy\src\TicTacToe.jar

编辑:请注意,调试dir语句会在else语句中获取其值

dir=Paths.get(uri);

1 个答案:

答案 0 :(得分:1)

当然它走向了其他道路 您正在检查的URI永远不会包含感叹号 但只是成为JAR文件的URI 除了你给这个方法作为参数给感兴趣的东西,但是我不会这样做。

你所追求的是

FileSystem fs = FileSystems.newFileSystem(new URI("jar:file:///path/to/the.jar"), Collections.<String,?>emptyMap());
Path dir = fs.getPath("/");
Files.newDirectoryStream(dir, "*.class*);

但请注意,这不会自动递归到子目录中。