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