Java 内存映射类路径资源

Java 内存映射类路径资源,java,Java,对于从我的服务器(嵌入在JAR中)提供的静态资源,我想对它们进行内存映射 我写了以下内容: try (InputStream is = getClass().getResourceAsStream(classpathItem)) { byte[] bytes = ByteStreams.toByteArray(is); ByteBuffer directBuffer = ByteBuffer.allocateDirect(bytes.length);

对于从我的服务器(嵌入在JAR中)提供的静态资源,我想对它们进行内存映射

我写了以下内容:

    try (InputStream is = getClass().getResourceAsStream(classpathItem)) {
        byte[] bytes = ByteStreams.toByteArray(is);

        ByteBuffer directBuffer = ByteBuffer.allocateDirect(bytes.length);
        directBuffer.put(bytes);
        directBuffer.flip();

        return directBuffer;
    }

然后我想,Java中必须有一个选项来完成这项工作(可能是一个JVM参数)。有这样的事情吗?

你可以用静态内容制造战争

目录:

web.xml

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

index.html
build.xml

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>


建造命令:蚂蚁战争


提供静态内容可能比创建jar更简单。

这个答案有点晚,但我只是偶然发现了这个问题

简而言之,答案是否定的,您不能从jar映射内存资源。 这是由于资源是如何存储在jar本身中的。jar文件实际上只是一个zip文件,而资源是zip文件的内容。这就是您无法将
文件
,或除
URL
InputStream
之外的任何内容获取到jar内资源的原因。
URL
只允许您打开一个
InputStream
,而
InputStream
本身只允许您对资源的内容进行流式传输,并在传输过程中解压缩

有趣的是,如果ZipFileSystem支持内存映射,这是可能的

如果
ZipFileSystem
支持内存映射,下面是一个代码片段:

// Hack to get URL to running jar
String path = Main.class.getResource("Main.class").toString().split("!")[0];
FileSystem fs = FileSystems.newFileSystem(URI.create(path), 
        Collections.singletonMap("create", "true"));
Path p = fs.getPath("/path/to/my/resource");
FileChannel fc = FileChannel.open(p);
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
问题是你得到了这个:

Exception in thread "main" java.lang.UnsupportedOperationException
        at com.sun.nio.zipfs.ZipFileSystem$4.map(ZipFileSystem.java:799)
        at com.example.Main.main(Main.java:25)
这可能是最好的,你不能这样做,因为你最有可能得到可怕的表现无论如何。Zip文件将文件平铺并压缩,因此,如果不先为自己分配内存映射缓冲区并将内容解压缩到其中,就无法轻松地将其布局


帮助您可能为时已晚,但这可能会阻止其他人以后进行白费力气:p

我有点困惑,这如何回答我的问题?这个简单的解决方案在自己的服务器tomcat上提供静态内容(资源)。很抱歉,但这不是我要问的问题。简单地说,我是在问,“如何映射类路径资源的内存?”这是一个枯燥的问题。可以看到tomcat是如何服务静态内容资源的,但却是重复代码。
Exception in thread "main" java.lang.UnsupportedOperationException
        at com.sun.nio.zipfs.ZipFileSystem$4.map(ZipFileSystem.java:799)
        at com.example.Main.main(Main.java:25)