摘要:項目地址,另外知乎同名文章也是我發布的,大家可以多多關注首先觀察控制臺其次再看本地壁紙庫現在進入正題,這個小項目用到了具體版本見,另外還用到了中的線程池阻塞隊列生產消費者模式文件監聽服務,所以至少要求版本為或者以上項目分為個類和一個方法入
項目地址,另外知乎同名文章也是我發布的,大家可以多多關注
首先觀察控制臺
其次再看本地壁紙庫
現在進入正題,這個小項目用到了 Jsoup具體版本見 POM),另外還用到了 JDK中的線程池、阻塞隊列(生產-消費者模式)、NIO2(文件監聽服務 API),所以至少要求 JDK版本為7或者以上
項目分為5個類和一個方法入口類
生產者類(任務:從列表頁拿到詳情頁鏈接并放入阻塞隊列)
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(); } } }
消費者類(任務:從隊列拿到鏈接并獲取圖片源地址并將下載任務交給一個緩存線程池)
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(); } } }
下載任務執行類(任務:下載圖片到本地)
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(); } } }
監聽服務類(任務:將文件路徑注冊到監聽服務上并開始監聽)
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(); } } }
監聽回調類(任務:執行回調任務)
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(); } }
最后就是設置壁紙庫并設定更換頻率
感謝大家,有問題可以再評論區留言~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70155.html
摘要:極簡壁紙是一個期望呈現出簡單高效美觀的壁紙網站。靈感來源是愛壁紙,圖片來源是極簡壁紙網站建立于年月日。入口極簡壁紙喜歡關于我們入口極簡壁紙關于我們如果喜歡的話可以來看看,地址,對于網站有什么意見建議也歡迎回復留言。 showImg(https://segmentfault.com/img/remote/1460000017965030); 極簡壁紙是一個期望呈現出簡單高效美觀的壁紙網站...
摘要:文章目錄在線圖片壓縮在線壓縮最好用的切圖工具在線工具一鍵摳圖免費字體免費素材圖片和視頻中國風配色網站免費壁紙免費短連接在線在線代碼編輯在線流程圖思維導圖在線圖片壓縮傳送門在線圖片壓縮網站已經優化超過十億張圖片,支持,,等格式的圖片的壓縮。 ...
摘要:爬取分辨率超清唯美壁紙簡介壁紙的選擇其實很大程度上能看出電腦主人的內心世界,有的人喜歡風景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動物。 @[toc] 爬取5K分辨率超清唯美壁紙 簡介 壁紙的選擇其實很大程度上能看出電腦主人的內心世界,有的人喜歡風景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動物。然而,終究有一天你已經產生審美疲勞了,但你下定決定要換壁紙的時候,又發現網上的壁紙要...
摘要:前言之前初學的時候,有用爬蟲爬過一些磁力鏈接詳情見羞羞的爬蟲但是沒有并發,沒有代理,那時也對異步不是很了解所以這次又寫了個爬蟲,爬取壁紙站的所有壁紙并且爬取開心代理的條,并將有用的存進文件中用到的模塊控制并發解析庫使用代理讀寫文件其中的具 前言 之前初學node的時候,有用爬蟲爬過一些磁力鏈接詳情見羞羞的node爬蟲但是沒有并發,沒有代理,那時也對異步不是很了解所以這次又寫了個爬蟲,爬...
閱讀 863·2021-11-24 09:38
閱讀 1096·2021-10-08 10:05
閱讀 2587·2021-09-10 11:21
閱讀 2809·2019-08-30 15:53
閱讀 1834·2019-08-30 15:52
閱讀 1973·2019-08-29 12:17
閱讀 3423·2019-08-29 11:21
閱讀 1616·2019-08-26 12:17