Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法从字节数组创建URL?_Java_Url_Bytearray_Classloader - Fatal编程技术网

Java 有没有办法从字节数组创建URL?

Java 有没有办法从字节数组创建URL?,java,url,bytearray,classloader,Java,Url,Bytearray,Classloader,有没有办法从字节数组创建URL?我有一个自定义类加载器,它将来自JarInputStream的所有条目存储在一个HashMap中,该HashMap存储条目名称及其字节。我希望从字节数组创建URL的原因是为了满足类加载器中的getResource(String name)方法。我已经使用ByteArrayInputStream完成了getResourceAsStream(字符串名称)。:构造函数之一是URL(字符串规范) 然后:其中一个构造函数是String(byte[]bytes) 使用字节数组

有没有办法从字节数组创建URL?我有一个自定义类加载器,它将来自JarInputStream的所有条目存储在一个HashMap中,该HashMap存储条目名称及其字节。我希望从字节数组创建URL的原因是为了满足类加载器中的getResource(String name)方法。我已经使用ByteArrayInputStream完成了getResourceAsStream(字符串名称)。

:构造函数之一是
URL(字符串规范)

然后:其中一个构造函数是
String(byte[]bytes)

使用
字节
数组创建
字符串
,然后使用创建的
字符串
创建
URL

String urlString = new String(yourByteArray);
URL yourUrl = new URL(urlString);

假设您使用自定义类加载器,并且希望在hashmap中存储/缓存内容的字节(而不是字节[]形式的位置)。你的问题和我来这里的问题一样。但我就是这样解决这个问题的:

class SomeClassLoader {
    private final Map<String, byte[]> entries = new HashMap<>();

    public URL getResource(String name) {

        try {
            return new URL(null, "bytes:///" + name, new BytesHandler());
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }

    }

    class BytesHandler extends URLStreamHandler {
        @Override
        protected URLConnection openConnection(URL u) throws IOException {
            return new ByteUrlConnection(u);
        }
    }

    class ByteUrlConnection extends URLConnection {
        public ByteUrlConnection(URL url) {
            super(url);
        }

        @Override
        public void connect() throws IOException {
        }

        @Override
        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(entries.get(this.getURL().getPath().substring(1)));
        }
    }
}
class-SomeClassLoader{
私有最终映射条目=新HashMap();
公共URL getResource(字符串名称){
试一试{
返回新URL(null,“bytes://“+name,new BytesHandler());
}捕获(格式错误){
抛出新的运行时异常(e);
}
}
类BytesHandler扩展了URLStreamHandler{
@凌驾
受保护的URL连接openConnection(URL u)引发IOException{
返回新的ByteUrlConnection(u);
}
}
类ByteUrlConnection扩展了URLConnection{
公共字节连接(URL){
超级链接(url);
}
@凌驾
public void connect()引发IOException{
}
@凌驾
公共InputStream getInputStream()引发IOException{
返回新的ByteArrayInputStream(entries.get(this.getURL().getPath().substring(1));
}
}
}

:构造函数之一是
URL(字符串规范)
。然后:其中一个构造函数是
String(byte[]bytes)
。使用
字节
数组创建一个
字符串
,然后使用创建的
字符串
创建
URL
Ah似乎有效,谢谢you@BackSlash你没有理由不把它作为回答而不是评论。如果它被投票通过,你会得到更多的声誉。@tbodt好的,posted字节[]包含什么?班名?如果是这样,为什么它不是一个字符串?字节数组不能像HashMap键那样工作。还是字节码本身?在这种情况下,您正在查找data:URL吗?很抱歉,这会产生一个错误的FormedUrlexception,因为字节[]包含的是二进制数据,而不是位置的二进制表示形式。这就是OP提到正在类加载器中缓存字节的原因。@KIC ok,但为什么这个答案不被接受呢?我也遇到过同样的情况,我刚刚尝试过(即使我有这种感觉,这永远不会成功)。然而,我已经提供了我自己的答案,我是如何解决这个问题的。@KIC如果你看OP的简介,你会发现只有一个问题有一个被接受的答案。在其他有答案的问题中,只有一条评论,没有接受。这个答案适用于OP,因此它意味着字节数组不包含二进制数据。这是他的情况,不是每个人的情况,这个答案是为了帮助这个具体的情况。如果您有另一种情况,请随便问一个新问题,您会得到更好的答案。这种类型会检查,但我认为它不会达到预期效果:它不会返回正在检索的资源的URL,而是返回一个URL,其路径是该资源的字符串表示形式。