java - 访问 JAR 文件时出现 NotDirectoryException

标签 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 文件存在并且它指向写入路径。可能是什么导致了这个问题?

目录打印以下内容:

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

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

dir=Paths.get(uri);

最佳答案

当然会到达else路径。
您正在检查的 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*);

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

关于java - 访问 JAR 文件时出现 NotDirectoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901262/

相关文章:

java - 使用 Spring Security 自定义注销 URL

java - 是否可以在 spring-data-elasticsearch 中将 Completion 字段与 Context Suggester 映射?

java - 如何解决eclipse中的java.lang.ClassNotFoundException

java - API 和 Web 服务有什么区别?

java - 如何使用 GraphStream 的继承在图表中存储数据

java - 应用程序如何使用 JAR 中的文件进行读写?

带有 Struts 1.x 版本的 AJAX

variables - 如何在没有脚本的情况下使用 ssis 创建空的 .txt 文件

c++ - 挂载文件系统和挂载磁盘驱动器有什么区别

c++ - 如何隐藏/取消隐藏文件而不删除 Windows 上 C++ 中的其他属性