澶у濂斤紝鎴戞槸浜屽摜锛佸緢涔呬互鍓嶏紝鏈夋湅鍙嬬粰鎴戝弽棣堣銆奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬬粡甯稿嚭鐜板浘鐗囦笉鏄剧ず鎴栬€呭姞杞芥參鐨勬儏鍐点€備絾鏄洜涓虹櫧瀚栵紙GitHubimagebed+jsdelivrCDN锛夌殑鍔涢噺澶己澶т簡锛堢嫍澶达級锛岃€屼笖鎴戣嚜宸变篃娌℃湁閬囧埌杩囪繖涓棶棰橈紝鎵€浠ヤ竴鐩存嫋鐫€娌℃湁琛屽姩銆傜洿鍒版湁涓€澶╋紝鎴戠殑绁炵娴侀噺鐢ㄥ畬浜嗭紝涓婁笉浜嗚胺姝岋紝涓婁笉浜哫.com銆傜劧鍚庢垜鍙戠幇鎴戠殑缃戠珯鍔犺浇鍥剧墖濂芥參锛侊紒锛侊紒缁忓父涓€涓帴涓€涓湴鍐掑嚭鏉ワ紝鑲夌溂锛堟湁杩戣鐪硷級鍙互鎱㈡參鐪嬨€備簨鎯呬笉闂瑰埌浠栧ご涓婏紝浠栨槑鏄庡氨楂橀珮鎸傝捣锛屽彲涓€鏃﹂椆鍒颁粬澶翠笂锛屼粬灏卞彈涓嶄簡浜嗭紒浜庢槸鎴戞墦寮€绔欓暱宸ュ叿鏌ョ湅鍥剧墖鐨勮闂€熷害锛屽ソ瀹朵紮锛屾垜鐩存帴濂藉浼欙紒鍥藉唴鐨勮闂€熷害鍙互椋欏埌100ms锛屽浗澶栫殑鐪熺殑寰堝揩锛屾墠14.7ms銆傝鐭ラ亾锛岀綉绔欓潰鍚戠殑鐢ㄦ埛缇や綋锛岀粷澶ч儴鍒嗛兘鏄浗鍐呮湅鍙嬨€傝繖閫熷害鐪熸槸璁╃敤鎴锋湜鑰屽嵈姝ワ紒鍙﹀锛屼粖澶╃湅鍒板皬鏋楀崌绾т簡浠栫殑缃戠珯鍜屼粬鐨勫浘搴婏紝灏卞繊涓嶄綇浜嗐€傝鎬庝箞鍔烇紵涓嶅彲鑳芥墜鍔ㄤ竴涓€鏇挎崲銆傘€奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬩笂鑷冲皯鏈?00绡囨枃绔犮€傚鏋滀竴绡囨枃绔犲钩鍧囨湁5寮犲浘鐗囷紝鍒欓渶瑕?000寮犲浘鐗囥€傚叏閮ㄦ浛鎹㈠畠浠苟涓嶇柉鐙傦紒鐢变簬鎴戝凡缁忔妸涓嶅悓绫诲埆鐨勫浘鐗囬兘淇濆瓨鍦ㄦ湰鍦颁簡锛屾墍浠ュ彧鍓╀笅涓€涓細绗竴姝ワ紝灏嗗浘鐗囦笂浼犲埌浜戝巶鍟嗐€傜浜屾锛屽皢鎵€鏈夋枃绔犱腑鐨勫浘鐗囬摼鎺ユ壒閲忔浛鎹负鏂扮殑鍥惧簥鍦板潃鏇挎崲閾炬帴銆備篃姣旇緝绠€鍗曪紝灏辨槸璇诲彇鎵€鏈夌殑md鏂囦欢锛屾壘鍒伴噷闈㈢殑鍥剧墖鍦板潃锛屽涓嬪浘鏇挎崲銆傜涓€姝ワ紝灏嗗浘搴撲笂浼犺嚦浜戝巶鍟嗭紝鐩存帴閫夋嫨鎵弿鏂囦欢澶瑰嵆鍙皢鎵€鏈夊浘鐗囦笂浼犺嚦鏂板浘搴娿€侾S锛氳繖閲屾湁涓€涓潙锛屼笉鐭ユ湁娌℃湁鐪煎皷鐨勬湅鍙嬬湅鍑烘潵锛熺浜屾锛屽紑鍚疌DN锛屽彧浣跨敤OSS銆傞櫎浜嗘祦閲忚璐硅緝楂樺锛屽浘鐗囨病鏈夊姞閫燂紝鎵€浠ラ『渚垮紑鍚簡CDN鏈嶅姟銆傚紑閫氭柟娉曞緢绠€鍗曪紝鍙渶瑕佸皢鍩熷悕杩斿洖缁橭SS鍗冲彲銆傜涓夋锛屽啓java浠g爜鎵归噺浼犺緭閾炬帴privatefinalstaticStringimg_url_pre_after="http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/images/";privatefinalstaticStringdocPath="/Users/maweiqing/Documents/GitHub/toBeBetterJavaer/docs/";publicstaticvoidmain(String[]args)throwsIOException{//閫掑綊閬嶅巻鐩綍鍙婂瓙鐩綍涓嬬殑鎵€鏈夋枃浠禠istfiles=FileUtil.loopFiles(docPath);log.info("鏂囦欢鎬绘暟{}",files.size());ExecutorServiceexecutorService=Executors.newCachedThreadPool();for(Filefile:files){if(FileNameUtil.isType(file.getName(),"md")){log.info("MD鏂囦欢{}",file.getName());executorService.submit(()->{FileReaderfileReader=FileReader.create(鏂囦欢,Charset.forName("utf-8"));瀛楃涓茬粨鏋?fileReader.readString().replaceAll(img_url_pre_before,img_url_pre_after);log.info("杞崲瀹屾垚");灏濊瘯{FileWriterwriter=newFileWriter(file);writer.write(缁撴灉);writer.flush();}catch(IOExceptione){log.error("鍐欏叆鏂囦欢{}鏃跺嚭閿?,e);}});}}}}鎬濊矾寰堢畝鍗曪紝浠g爜琛屼篃涓嶅锛氶€氳繃hutool鐨凢ileUtil.loopFiles()鏂规硶閫掑綊閬嶅巻鐩綍鍙婂瓙鐩綍涓嬬殑鎵€鏈夋枃浠讹紱閫氳繃Executors.newCachedThreadPool()鍒涘缓缂撳瓨绾跨▼姹犮€傜敱浜庢渶澶?087涓枃浠讹紝鏃犻渶鎷呭績绾跨▼姹犺祫婧愯€楀敖锛涙棤闇€涓ユ牸鎸夌収闃块噷鎵嬪唽涓笉鑳戒娇鐢‥xecutors鍒涘缓绾跨▼姹犵殑寮哄埗瑕佹眰锛屽洜鍦板埗瀹滐紱寰幆閬嶅巻鎵€鏈夋枃浠讹紝閫氳繃FileNameUtil.isType()杩囨护鎺変笉鏄痬d鐨勬枃浠讹紱閫氳繃FileReader鍐呭璇诲彇鏂囦欢锛岄€氳繃String绫荤殑replaceAll()鏂规硶鏇挎崲鍘熸潵鐨勫浘鐗囬摼鎺ワ紱閫氳繃FileWriter閲嶅啓鏂囦欢锛涙煡鐪嬫墽琛屾棩蹇楋細17:29:30.547[main]INFOtop.image.ConvertAllFileWithPool-Thetotalnumberoffilesis1087銆?17:29:30.649[main]INFOtop.image.ConvertAllFileWithPool-MD鏂囦欢flow-control.md17:29:30.649[pool-1-thread-12]INFOtop.image.ConvertAllFileWithPool-杞崲瀹屾垚17:29:30.649[pool-1-thread-4]INFOtop.image.ConvertAllFileWithPool-杞崲瀹屾垚17:29:30.649[pool-1-thread-8]INFOtop.image.ConvertAllFileWithPool-杞崲瀹屾垚17:29:30.649[pool-1-thread-5]INFOtop.image.ConvertAllFileWithPool-杞崲鍩烘湰涓婂湪涓嶅埌涓€绉掔殑鏃堕棿鍐呭畬鎴愩€傚洜涓轰娇鐢ㄤ簡GitHub浣滀负鐗堟湰浠撳簱锛屾墍浠ユ垜浠彲浠ュぇ鑳嗘墽琛岋紝涓嶇敤鎷呭績鍑洪敊銆傛鏌ュ嚑涓枃浠讹紝纭畾OK鍚庯紝灏卞彲浠ュ皢淇敼鍚庣殑鏂囦欢鎻愪氦鍒扮増鏈簱浜嗐€傞噸鏂伴儴缃茬綉绔欏悗锛屾墦寮€绔欓暱宸ュ叿锛岄噸鏂版祴璇曞浘鐗囪闂€熷害銆傝繖涓€娆★紝閫熷害蹇浜嗐€傚湪鍥藉唴鍩烘湰閮藉湪20ms宸﹀彸锛屾瘮鍘熸潵鐨?00ms蹇簡浜斿垎涔嬪洓锛佹棭鐭ュ姝わ紝鎴戞棭灏卞垏鎹㈤摼鎺ヤ簡锛佷笂浼犳湰鍦板浘鐗囧埌OSS鐨勬椂鍊欐病娉ㄦ剰銆傚浜嗕竴涓猧mages鐩綍锛屽鑷存垜寤虹珯鍚庡彂鐜版墍鏈夊浘鐗囬兘鎸備簡锛佷紬浜轰竴鏃舵厡浜嗙锛孫SS骞舵病鏈夋彁渚涚Щ鍔ㄨ祫婧愮殑鍔熻兘锛屾墍浠ユ垜浠彧鑳藉湪md鏂囦欢涓坊鍔犱竴涓猧mages鐩綍锛岀幇鍦ㄥ彧鑳界姱閿欎簡銆傛敹浜?00鍧楅挶锛屼笉鐭ラ亾瑕佸涔咃紝OSS+CDN锛岄摼鎺ラ噷娌℃暍鐢℉TTPS锛屽洜涓篐TTPS涔熸槸鏀惰垂鐨勶紝鎵€浠ュ厛鐢℉TTP鍚с€傚棷锛屼粖澶╂槸鍔冲姩鑺傚悗鐨勭涓€澶╀笂鐝紙鏄ㄥぉ鍏ㄥ憳鏍搁吀妫€娴嬶級銆備竴澶ф棭灏辫捣搴婏紝鍒跺畾浜嗕簲鏈堟槦鐞冪殑瀛︿範璁″垝銆傝澶氶珮灏斿か鐞冩墜鍝嶅簲骞跺埗瀹氫簡鑷繁鐨勮鍒掋€傚涔犺鍒掋€俶edicinerolltogether锛堢嫍澶达級寮虹儓鎺ㄨ崘涓€娉itHub涓?k+star鐨勫紑婧愪笓鏍忋€奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬨€傛嵁璇存瘡涓€涓紭绉€鐨凧ava绋嬪簭鍛橀兘鍠滄濂癸紝濂瑰菇榛橀瓒o紝閫氫織鏄撴噦銆傚唴瀹瑰寘鎷琂ava鍩虹銆丣ava骞跺彂缂栫▼銆丣ava铏氭嫙鏈恒€丣ava浼佷笟绾у紑鍙戙€丣ava闈㈣瘯绛夋牳蹇冪煡璇嗙偣銆傚涔燡ava锛屽彧涓哄鎵綣ava绋嬪簭鍛樼殑杩涢樁涔嬭矾馃槃銆俬ttps://github.com/itwanger/toBeBetterJavaerstar杩欎釜瀛樺偍搴撴剰鍛崇潃浣犳湁娼滃姏鎴愪负涓€鍚嶄紭绉€鐨凧ava宸ョ▼甯堛€傛病鏈変粈涔堣兘闃绘鎴戔€斺€旈櫎浜嗙洰鐨勶紝灏界宀镐笂鏈夌帿鐟般€佺豢鑽拰瀹侀潤鐨勯伩椋庢腐锛屼絾鎴戞病鏈夎鏉熺細銆?/p>