Java 尝试实现可操作的zip文件系统-失败

Java 尝试实现可操作的zip文件系统-失败,java,zip,nio,Java,Zip,Nio,我需要找到一个能够直接操作zip/jar(无需解包)并且不使用第三方库的解决方案。然而,我似乎无法理解文件系统是如何与路径和URI联系在一起的 我试图复制到的URI是jar:file://E:/Projects/ZipDir/dist/test\u folder/test.zip/test_file.txt 我得到的例外是: FileSystemNotFoundException但该zip文件确实存在 使用Java 7,到目前为止我已经做到了: ... ZipDirectory zip = ne

我需要找到一个能够直接操作zip/jar(无需解包)并且不使用第三方库的解决方案。然而,我似乎无法理解
文件系统
是如何与
路径
URI
联系在一起的

我试图复制到的URI是
jar:file://E:/Projects/ZipDir/dist/test\u folder/test.zip/test_file.txt

我得到的例外是:
FileSystemNotFoundException
但该zip文件确实存在

使用Java 7,到目前为止我已经做到了:

...
ZipDirectory zip = new ZipDirectory("test_folder/test.zip");
Path copyTo = zip.getPath("/test_file.txt");
Path copyFrom = Paths.get("test_file.txt");

Files.copy(copyFrom, copyTo, StandardCopyOption.REPLACE_EXISTING);
...
//

import java.io.IOException;
导入java.net.URI;
导入java.nio.file.*;
导入java.util.HashMap;
公共类ZipDirectory{
专用路径;
专用文件系统;
公共ZipDirectory(字符串路径){
this.path=path.get(path.get(path.toUri());
创建();
}
私有void create(){
HashMap env=新的HashMap();
环境出售(“创建”、“真实”);
试试{
fileSystem=FileSystems.newFileSystem(路径,null);
}捕获(IOEX异常){
系统输出打印项次(ex);
}
}
公共路径getPath(字符串相对路径){
返回path.get(URI.create(“jar:file:/”+path.toUri().getPath()+“!”+fileSystem.getPath(relativePath));
}
公共路径getRoot(){
返回path.get(URI.create(path.toUri().getPath()+“!/”);
}
公众假期结束(){
试一试{
close();
}捕获(IOEX异常){
系统错误打印项次(ex);
}
文件系统=空;
}
}

我从未想过我会回答自己的问题,但我已经让它起作用了:

import java.io.IOException;
import java.net.URI;
import java.nio.file.*;
import java.util.HashMap;

public class ZipDirectory {

    private Path path;
    private FileSystem fileSystem;

    public ZipDirectory(String path){
        this.path = Paths.get(Paths.get(path).toUri());
        create();
    }

    private void create(){
        HashMap<String, String> env = new HashMap<>(); 
        env.put("create", "true");
        try {          
            fileSystem = FileSystems.newFileSystem(path, null);
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

    public Path getPath(String relativePath){
        return Paths.get(URI.create("jar:file:/" + path.toUri().getPath() + "!" + fileSystem.getPath(relativePath)));
    }

    public Path getRoot(){
        return Paths.get(URI.create(path.toUri().getPath() + "!/"));
    }

    public void close(){
        try {
            fileSystem.close();
        } catch (IOException ex) {
            System.err.println(ex);
        }
        fileSystem = null;
    }
}