摘要:項(xiàng)目地址,另外知乎同名文章也是我發(fā)布的,大家可以多多關(guān)注首先觀察控制臺其次再看本地壁紙庫現(xiàn)在進(jìn)入正題,這個(gè)小項(xiàng)目用到了具體版本見,另外還用到了中的線程池阻塞隊(duì)列生產(chǎn)消費(fèi)者模式文件監(jiān)聽服務(wù),所以至少要求版本為或者以上項(xiàng)目分為個(gè)類和一個(gè)方法入
項(xiàng)目地址,另外知乎同名文章也是我發(fā)布的,大家可以多多關(guān)注
首先觀察控制臺
其次再看本地壁紙庫
現(xiàn)在進(jìn)入正題,這個(gè)小項(xiàng)目用到了 Jsoup具體版本見 POM),另外還用到了 JDK中的線程池、阻塞隊(duì)列(生產(chǎn)-消費(fèi)者模式)、NIO2(文件監(jiān)聽服務(wù) API),所以至少要求 JDK版本為7或者以上
項(xiàng)目分為5個(gè)類和一個(gè)方法入口類
生產(chǎn)者類(任務(wù):從列表頁拿到詳情頁鏈接并放入阻塞隊(duì)列)
public class Producer implements Runnable { private String name; private BlockingQueueblockingQueue; public Producer(String name, BlockingQueue blockingQueue) { this.name = name; this.blockingQueue = blockingQueue; } @Override public void run() { Document doc = null; try { for(int i = 1; i < 12018; i ++) { System.out.println(); System.out.println(); System.out.println("current page:" + i); System.out.println("-----------------------------------"); if(i == 1) { doc = Jsoup.connect("https://alpha.wallhaven.cc/latest").get(); } else { doc = Jsoup.connect("https://alpha.wallhaven.cc/latest?page=" + i).get(); } Element div = doc.getElementById("thumbs"); Elements sections = div.getElementsByTag("section"); for (Element ele : sections) { Elements links = ele.getElementsByClass("preview"); for (Element e : links) { String href = e.attr("href"); blockingQueue.put(href); System.out.println(name + " put " + href); } } } blockingQueue.put(""); System.out.println(name + " is over"); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
消費(fèi)者類(任務(wù):從隊(duì)列拿到鏈接并獲取圖片源地址并將下載任務(wù)交給一個(gè)緩存線程池)
public class Consumer implements Runnable { private String name; private BlockingQueueblockingQueue; private ExecutorService taskPool; public Consumer(String name, BlockingQueue blockingQueue, ExecutorService taskPool) { this.name = name; this.blockingQueue = blockingQueue; this.taskPool = taskPool; } @Override public void run() { Document doc = null; try { String href = null; while((href = blockingQueue.take()) != "") { System.out.println(name + " take " + href); doc = Jsoup.connect(href).get(); Element img = doc.getElementById("wallpaper"); String src = "https:" + img.attr("src"); taskPool.submit(new DownloadTask(src)); } System.out.println(name + " is over"); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
下載任務(wù)執(zhí)行類(任務(wù):下載圖片到本地)
public class DownloadTask implements Runnable { private static String path = "C:UsersaiyapengDesktopPaper"; private String src; private String name; public DownloadTask(String src) { this.src = src; int n = src.lastIndexOf("/"); this.name = src.substring(++n); } @Override public void run() { Response res = null; try { res = Jsoup.connect(src).ignoreContentType(true).timeout(30000).execute(); byte[] bytes = res.bodyAsBytes(); File file = new File(path + name); if (!file.exists()) { RandomAccessFile raf = new RandomAccessFile(file, "rw"); raf.write(bytes); raf.close(); } } catch (IOException e1) { e1.printStackTrace(); } } }
監(jiān)聽服務(wù)類(任務(wù):將文件路徑注冊到監(jiān)聽服務(wù)上并開始監(jiān)聽)
public class ResourceListener { private static ExecutorService fixedThreadPool = Executors.newCachedThreadPool(); private WatchService ws; private ResourceListener(String path) { try { ws = FileSystems.getDefault().newWatchService(); start(); } catch (IOException e) { e.printStackTrace(); } } private void start() { fixedThreadPool.execute(new Listener(ws)); } public static void addListener(String path) { try { ResourceListener resourceListener = new ResourceListener(path); Path p = Paths.get(path); p.register(resourceListener.ws, StandardWatchEventKinds.ENTRY_CREATE); } catch (IOException e) { e.printStackTrace(); } } }
監(jiān)聽回調(diào)類(任務(wù):執(zhí)行回調(diào)任務(wù))
public class Listener implements Runnable { private WatchService service; public Listener(WatchService service) { this.service = service; } @Override public void run() { try { while (true) { WatchKey watchKey = service.take(); List> watchEvents = watchKey.pollEvents(); for (WatchEvent> event : watchEvents) { System.err.println(event.context() + "已下載"); } watchKey.reset(); } } catch (InterruptedException e) { e.printStackTrace(); } } }
方法入口類
public class DownloadTaskExecutor { public static void main(String[] args) throws IOException { ResourceListener.addListener("C:UsersaiyapengDesktopPaper"); BlockingQueueblockingQueue = new SynchronousQueue (true); ExecutorService proservice = Executors.newSingleThreadExecutor(); ExecutorService conservice = Executors.newSingleThreadExecutor(); ExecutorService taskPool = Executors.newCachedThreadPool(); proservice.submit(new Producer("Producer", blockingQueue)); conservice.submit(new Consumer("Consumer", blockingQueue, taskPool)); proservice.shutdown(); conservice.shutdown(); } }
最后就是設(shè)置壁紙庫并設(shè)定更換頻率
感謝大家,有問題可以再評論區(qū)留言~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70155.html
摘要:極簡壁紙是一個(gè)期望呈現(xiàn)出簡單高效美觀的壁紙網(wǎng)站。靈感來源是愛壁紙,圖片來源是極簡壁紙網(wǎng)站建立于年月日。入口極簡壁紙喜歡關(guān)于我們?nèi)肟跇O簡壁紙關(guān)于我們?nèi)绻矚g的話可以來看看,地址,對于網(wǎng)站有什么意見建議也歡迎回復(fù)留言。 showImg(https://segmentfault.com/img/remote/1460000017965030); 極簡壁紙是一個(gè)期望呈現(xiàn)出簡單高效美觀的壁紙網(wǎng)站...
摘要:文章目錄在線圖片壓縮在線壓縮最好用的切圖工具在線工具一鍵摳圖免費(fèi)字體免費(fèi)素材圖片和視頻中國風(fēng)配色網(wǎng)站免費(fèi)壁紙免費(fèi)短連接在線在線代碼編輯在線流程圖思維導(dǎo)圖在線圖片壓縮傳送門在線圖片壓縮網(wǎng)站已經(jīng)優(yōu)化超過十億張圖片,支持,,等格式的圖片的壓縮。 ...
摘要:爬取分辨率超清唯美壁紙簡介壁紙的選擇其實(shí)很大程度上能看出電腦主人的內(nèi)心世界,有的人喜歡風(fēng)景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動物。 @[toc] 爬取5K分辨率超清唯美壁紙 簡介 壁紙的選擇其實(shí)很大程度上能看出電腦主人的內(nèi)心世界,有的人喜歡風(fēng)景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動物。然而,終究有一天你已經(jīng)產(chǎn)生審美疲勞了,但你下定決定要換壁紙的時(shí)候,又發(fā)現(xiàn)網(wǎng)上的壁紙要...
摘要:前言之前初學(xué)的時(shí)候,有用爬蟲爬過一些磁力鏈接詳情見羞羞的爬蟲但是沒有并發(fā),沒有代理,那時(shí)也對異步不是很了解所以這次又寫了個(gè)爬蟲,爬取壁紙站的所有壁紙并且爬取開心代理的條,并將有用的存進(jìn)文件中用到的模塊控制并發(fā)解析庫使用代理讀寫文件其中的具 前言 之前初學(xué)node的時(shí)候,有用爬蟲爬過一些磁力鏈接詳情見羞羞的node爬蟲但是沒有并發(fā),沒有代理,那時(shí)也對異步不是很了解所以這次又寫了個(gè)爬蟲,爬...
閱讀 853·2021-11-24 09:38
閱讀 1085·2021-10-08 10:05
閱讀 2577·2021-09-10 11:21
閱讀 2800·2019-08-30 15:53
閱讀 1827·2019-08-30 15:52
閱讀 1964·2019-08-29 12:17
閱讀 3418·2019-08-29 11:21
閱讀 1609·2019-08-26 12:17