2013-07-21 89 views
4

有什麼辦法從字節數組創建一個URL?我有一個自定義的類加載器,它將所有來自JarInputStream的條目存儲在一個HashMap中,這些HashMap存儲了條目名和字節。我期望從字節數組創建URL的原因是爲了滿足ClassLoaders中的getResource(String name)方法。我已經通過使用ByteArrayInputStream完成了getResourceAsStream(String name)。任何方式從字節數組創建一個URL?

+2

[java.net.URL中docuentation(http://docs.oracle.com/javase/6/docs/api/java/net/URL。 html):其中一個構造函數是'URL(String spec)'。然後[java.lang.String文檔](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html):其中一個構造函數是'String(byte [] bytes) '。用你的'byte'數組創建一個'String',然後使用創建的'String'來創建URL' – BackSlash

+0

啊好像在工作,謝謝 – user1625108

+0

@BackSlash你沒有理由不把它作爲答案的評論。如果它被投票,你會獲得更多的聲譽。 – tbodt

回答

-1

java.net.URL doc:其中一個構造函數是URL(String spec)

Then java.lang.String doc:其中一個構造函數是String(byte[] bytes)

創建Stringbyte數組,然後使用創建的String創建URL

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

抱歉,這給出了MalformedURLException,因爲它們byte []是連續的二進制數據而不是位置的二進制表示。這就是爲什麼OP提到在類加載器中緩存字節的原因。 – KIC

+0

@KIC [*啊似乎工作,謝謝*](http://stackoverflow.com/questions/17776884/any-way-to-create-a-url-from-a-byte-array/17782177#comment -25928353) – BackSlash

+0

好的,但爲什麼這個答案不被接受呢?而且我也有同樣的情況,而且我剛剛嘗試過(即使我有這種感覺,這種感覺永遠不會消失)。然而,我已經提供了我自己的答案,我是如何解決這個問題的。 – KIC

4

假設您使用自定義類加載器和要存儲/緩存內容的字節中hashmap(不是以byte []形式存在的位置)。比你有同樣的問題把我帶到這裏。但是,這是我如何能夠解決這個問題:

class Somelassloader { 
    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 { 
      System.out.println(this.getURL().getPath().substring(1)); 
      return new ByteArrayInputStream(entries.get(this.getURL().getPath().substring(1))); 
     } 
    } 
}