2016-08-18 56 views
2

據我所知,沒有在JxBrowser的favicons基礎設施。該圖標不應該成爲冠軍賽的一部分嗎?我想我最好的選擇是去http://<domain>/favicon.ico,但這將是非常多餘的工作(http客戶端和緩存機制)。JxBrowser策略有效地檢索favicon

有沒有什麼辦法可以使用JxBrowser來優雅地照顧這件事?

我已經嘗試了兩種策略,試圖可靠地獲得資源的保持,這是不夠可靠,但:

事件基於URL採集(ResourceType.FAVICON是從未見過):

browser.context.networkService.resourceHandler = object : ResourceHandler { 
    override fun canLoadResource(p0: ResourceParams?): Boolean { 
     if (p0!!.resourceType == ResourceType.FAVICON) println(p0!!.url) 
     if (p0!!.resourceType == ResourceType.IMAGE && p0.url.contains("favicon")) println("found favicon url: ${p0.url}") 
     return true 
    } 
} 

//基於xpath的方法

browser.addLoadListener(object : LoadListener { 
    override fun onDocumentLoadedInMainFrame(p0: LoadEvent) { 
     p0.inSwingThread { 
      val res = it.browser.document.findElements(By.xpath("//link[@rel=\"icon\" or @rel=\"shortcut icon\"]")) 
      res.forEach { 
       println("----------") 
       it.attributes.forEach { println(it.key + " " + it.value) } 
      } 
     } 
    } 
    // ... 
} 
+0

您可能希望在第一個代碼塊中的if條件後面插入換行符(我不熟悉語法,因此我不想以某種方式中斷代碼)。在我的計算機上,如果有條件的話,第二個條件之後的代碼不能被看到,除非你向右滾動,如果條件爲真,看起來好像你想'返回true'。 –

回答

1

現在JxBrowser API不提供允許下載favicon.ico文件的功能。我建議你使用標準的Java API和http://<domain>/favicon.ico的方法。例如:

URL url = new URL("http://stackoverflow.com/favicon.ico"); 
InputStream in = new BufferedInputStream(url.openStream()); 
OutputStream out = new BufferedOutputStream(new FileOutputStream("D:/favicon.ico")); 
for (int i; (i = in.read()) != -1;) { 
    out.write(i); 
} 
in.close(); 
out.close();