2016-08-18 50 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();