JxBrowser提高检索网站图标效率的策略

3
据我所知,JxBrowser中没有关于网站图标的基础设施。网站图标不应该是标题事件的一部分吗?我认为最好的办法就是使用http://<domain>/favicon.ico,但这将会产生很多冗余工作(HTTP客户端和缓存机制)。
有没有什么方法可以优雅地使用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) }
            }
        }
    }
    // ...
}

你可能想在第一个代码块中的if条件语句之后插入一个换行符(我不熟悉语法,所以我不想在某种程度上破坏代码)。在我的电脑上,如果不向右滚动,就看不到第二个if条件语句之后的代码,这使得似乎你希望在那个条件为真时返回true。 - Jonny Henly
1个回答

2

目前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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接