Java 我可以以只读模式打开zip文件系统吗?

Java 我可以以只读模式打开zip文件系统吗?,java,nio2,Java,Nio2,我试图统一代码来列出文件,无论它们是在目录中还是在类路径上 我可以获取资源位置的URL: uriuri=FontManagerTestUtils.class.getResource(“/fonts”).toURI(); 文件系统= newFileSystem(uri,Collections.emptyMap()); 但是安全经理不喜欢它: java.security.AccessControlException: access denied ("java.io.FilePermission"

我试图统一代码来列出文件,无论它们是在目录中还是在类路径上

我可以获取资源位置的URL:

uriuri=FontManagerTestUtils.class.getResource(“/fonts”).toURI();
文件系统=
newFileSystem(uri,Collections.emptyMap());
但是安全经理不喜欢它:

java.security.AccessControlException: access denied ("java.io.FilePermission" "/Users/tester/.gradle/caches/modules-2/files-2.1/com.acme.utilities/acme-utils/2.0.4/2c3dd60154b9f63c52ee0defe82422c2987f69b5/acme-utils-2.0.4.jar" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkWrite(SecurityManager.java:979)
    at sun.nio.fs.UnixPath.checkWrite(UnixPath.java:801)
    at sun.nio.fs.UnixFileSystemProvider.checkAccess(UnixFileSystemProvider.java:294)
    at java.nio.file.Files.isAccessible(Files.java:2455)
    at java.nio.file.Files.isWritable(Files.java:2521)
    at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:125)
    at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)
    at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)
    at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)
java.security.AccessControlException:拒绝访问(“java.io.FilePermission”“/Users/tester/.gradle/caches/modules-2/files-2.1/com.acme.utilities/acme-utils/2.0.4/2c3dd60154b9f63c52ee0defe82422c2987f69b5/acme-utils-2.0.4.jar”“写入”)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
位于java.security.AccessController.checkPermission(AccessController.java:884)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
在java.lang.SecurityManager.checkWrite(SecurityManager.java:979)
位于sun.nio.fs.UnixPath.checkWrite(UnixPath.java:801)
位于sun.nio.fs.UnixFileSystemProvider.checkAccess(UnixFileSystemProvider.java:294)
可以访问java.nio.file.Files.isAccessible(Files.java:2455)
位于java.nio.file.Files.iswriteable(Files.java:2521)
位于com.sun.nio.zipfs.ZipFileSystem(ZipFileSystem.java:125)
位于com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)
位于java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)
位于java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)

不过,我并不打算写回jar,而且我的安全策略允许读取类路径上的jar文件,那么,有没有办法告诉它不要用写访问权限打开它呢?

这个错误来自
SecurityManager
——它是
AccessControlException
而不是
accessdeniedeexception
ReadOnlyFileSystemException
@Slaw是的,但正如你所看到的,它在请求“写”权限。我的安全策略确实允许“读取”权限。看起来像是
ZipFileSystem
检查写入权限,以确定它是否为只读。此过程的一部分涉及咨询
安全管理器(如果已安装)。但是,通过查看源代码,它在
AccessController#doPrivileged
调用中检查写访问权限(与检查读访问权限不同),这可能意味着授予对
ZipFileSystem
的代码源的写访问权限可能有效。@Slaw但我不想授予任何人对我的jar文件缓存的写访问权限。:(不确定您想要实现什么,但您能捕获异常吗?该错误来自
SecurityManager
——它是
AccessControlException
而不是
accessdeniedeexception
ReadOnlyFileSystemException
@Slaw是的,但正如您所看到的,它要求“写入”允许。我的安全策略允许“读取”权限。类似于
ZipFileSystem
检查写入权限,以确定它是否为只读。此过程的一部分涉及咨询
SecurityManager
(如果已安装)。但是,通过查看源代码,它会在
AccessController#doPrivileged
调用中检查写入权限(与检查读访问权限不同),这可能意味着授予对
ZipFileSystem
的代码源的写访问权限可能会起作用。@Slaw但我不想授予任何人对我的jar文件缓存的写访问权限。:(不确定要实现什么,但您能捕获异常吗?