最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java語(yǔ)言如何生成plist下載ipa文件

 更新時(shí)間:2023年08月23日 15:14:38   作者:永不停歇的火車  
這篇文章主要介紹了java語(yǔ)言如何生成plist下載ipa文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java語(yǔ)言生成plist下載ipa文件

在通過(guò)html頁(yè)面下載ipa文件安裝,需要通過(guò)plist文件下載,并且還要遵循 itms-services協(xié)議。 

也就說(shuō)我們需要生產(chǎn)plist文件,然后通過(guò)html頁(yè)面鏈接指向plist文件。

下面是通過(guò)java語(yǔ)言生成plist文件:

public static String createPlist(String url,String version,String title) throws IOException{
        log.info("==========開(kāi)始創(chuàng)建plist文件");
        //這個(gè)地址應(yīng)該是創(chuàng)建的服務(wù)器地址,在這里用生成到本地磁盤地址
        final String path = GetPropertiesValue.getValues("ios_plists_path");
        File file = new File(path);
        if (!file.exists()) {
            file.setWritable(true);//賦予文件權(quán)限
            file.mkdirs();
        }
        String plistFile = GetPropertiesValue.getValues("plists_name");//文件名稱
        final String PLIST_PATH = path + plistFile;
        file = new File(PLIST_PATH);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String sub_title = GetPropertiesValue.getValues("plists_sub_title");
        String plist = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                 + "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                 + "<plist version=\"1.0\">\n" + "<dict>\n"
                 + "<key>items</key>\n" 
                 + "<array>\n" 
                 + "<dict>\n"
                 + "<key>assets</key>\n" 
                 + "<array>\n" 
                 + "<dict>\n"
                 + "<key>kind</key>\n"
                 + "<string>software-package</string>\n"
                 + "<key>url</key>\n"
                 //你之前所上傳的ipa文件路徑
                 + "<string>"+url+"</string>\n" 
                 + "</dict>\n" 
                 + "</array>\n"
                 + "<key>metadata</key>\n"
                 + "<dict>\n"
                 + "<key>bundle-identifier</key>\n"
                 //這個(gè)是開(kāi)發(fā)者賬號(hào)用戶名,也可以為空,為空安裝時(shí)看不到圖標(biāo),完成之后可以看到
                 + "<string></string>\n"
                 + "<key>bundle-version</key>\n"
                 + "<string>"+version+"</string>\n"
                 + "<key>kind</key>\n"
                 + "<string>software</string>\n"
                 + "<key>subtitle</key>\n"
                 + "<string>"+sub_title+"</string>\n"
                 + "<key>title</key>\n"

上面重要的地方有兩點(diǎn)

  • url:這個(gè)參數(shù)是為了找到你自己上傳的ipa文件;
  • bundle-identifier:這個(gè)參數(shù)是開(kāi)發(fā)者賬號(hào)用戶名,可以為空或任意,區(qū)別在于安裝的過(guò)程中有無(wú)圖標(biāo)和進(jìn)度

下面是生成html文件,通過(guò)html的方式下載這個(gè)ipa文件。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下載</title>
<script type="text/javascript">
var url = 'https://127.0.0.1:8080//upload/plists/20160606143426371_63551_1.plist';
window.location.href = "itms-services://?action=download-manifest&url=" + url;
</script>
</head>
<body></body>
</html>

注意:訪問(wèn)這個(gè)plist文件的時(shí)候必須是基于HTTPS的,所以這就需要有一臺(tái)https服務(wù)器 。

這樣只要我們只要訪問(wèn)這個(gè)html地址,就可以自動(dòng)下載ipa文件了。 

解析ipa生成plist文件

1.引入工具類jar

?? ??? ?<dependency>
? ? ? ? ? ? <groupId>ant</groupId>
? ? ? ? ? ? <artifactId>ant</artifactId>
? ? ? ? ? ? <version>1.6.5</version>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>com.googlecode.plist</groupId>
? ? ? ? ? ? <artifactId>dd-plist</artifactId>
? ? ? ? ? ? <version>1.8</version>
? ? ? ? </dependency>

2.解析代碼

package com.ouyeel.ssx.admin.utils;
import com.dd.plist.NSDictionary;
import com.dd.plist.NSString;
import com.dd.plist.PropertyListParser;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class AnalysisIpa {
? ? private static Logger logger = LoggerFactory.getLogger(AnalysisIpa.class);
?? ?/**
? ? ?* 解壓IPA文件,只獲取IPA文件的Info.plist文件存儲(chǔ)指定位置
? ? ?* @param file
? ? ?* zip文件
? ? ?* @param unzipDirectory
? ? ?* 解壓到的目錄
? ? ?* @throws Exception
? ? ?*/
? ? private static File getZipInfo(File file, String unzipDirectory)
? ? ? ? ? ? throws Exception {
? ? ? ? // 定義輸入輸出流對(duì)象
? ? ? ? InputStream input = null;
? ? ? ? OutputStream output = null;
? ? ? ? File result = null;
? ? ? ? File unzipFile = null;
? ? ? ? ZipFile zipFile = null;
? ? ? ? try {
? ? ? ? ? ? // 創(chuàng)建zip文件對(duì)象
? ? ? ? ? ? zipFile = new ZipFile(file);
? ? ? ? ? ? // 創(chuàng)建本zip文件解壓目錄
? ? ? ? ? ? String name = file.getName().substring(0,file.getName().lastIndexOf("."));
? ? ? ? ? ? unzipFile = new File(unzipDirectory + "/" + name);
? ? ? ? ? ? if (unzipFile.exists()){
? ? ? ? ? ? ? ? unzipFile.delete();
? ? ? ? ? ? }
? ? ? ? ? ? unzipFile.mkdir();
? ? ? ? ? ? // 得到zip文件條目枚舉對(duì)象
? ? ? ? ? ? Enumeration<ZipEntry> zipEnum = zipFile.getEntries();
? ? ? ? ? ? // 定義對(duì)象
? ? ? ? ? ? ZipEntry entry = null;
? ? ? ? ? ? String entryName = null;
? ? ? ? ? ? String names[] = null;
? ? ? ? ? ? int length;
? ? ? ? ? ? // 循環(huán)讀取條目
? ? ? ? ? ? while (zipEnum.hasMoreElements()) {
? ? ? ? ? ? ? ? // 得到當(dāng)前條目
? ? ? ? ? ? ? ? entry = zipEnum.nextElement();
? ? ? ? ? ? ? ? entryName = new String(entry.getName());
? ? ? ? ? ? ? ? // 用/分隔條目名稱
? ? ? ? ? ? ? ? names = entryName.split("\\/");
? ? ? ? ? ? ? ? length = names.length;
? ? ? ? ? ? ? ? for (int v = 0; v < length; v++) {
? ? ? ? ? ? ? ? ? ? if(entryName.endsWith(".app/Info.plist")){ // 為Info.plist文件,則輸出到文件
? ? ? ? ? ? ? ? ? ? ? ? input = zipFile.getInputStream(entry);
? ? ? ? ? ? ? ? ? ? ? ? result = new File(unzipFile.getAbsolutePath()+ "/Info.plist");
? ? ? ? ? ? ? ? ? ? ? ? output = new FileOutputStream(result);
? ? ? ? ? ? ? ? ? ? ? ? byte[] buffer = new byte[1024 * 8];
? ? ? ? ? ? ? ? ? ? ? ? int readLen = 0;
? ? ? ? ? ? ? ? ? ? ? ? while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1){
? ? ? ? ? ? ? ? ? ? ? ? ? ? output.write(buffer, 0, readLen);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? } catch (Exception ex) {
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? if (input != null)
? ? ? ? ? ? ? ? input.close();
? ? ? ? ? ? if (output != null) {
? ? ? ? ? ? ? ? output.flush();
? ? ? ? ? ? ? ? output.close();
? ? ? ? ? ? }
? ? ? ? ? ? // 必須關(guān)流,否則文件無(wú)法刪除
? ? ? ? ? ? if(zipFile != null){
? ? ? ? ? ? ? ? zipFile.close();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 如果有必要?jiǎng)h除多余的文件
? ? ? ? if(file.exists()){
? ? ? ? ? ? file.delete();
? ? ? ? }
? ? ? ? return result;
? ? }
/**
? ? ?* IPA文件的拷貝,把一個(gè)IPA文件復(fù)制為Zip文件,同時(shí)返回Info.plist文件
? ? ?* 參數(shù) oldfile 為 IPA文件
? ? ?*/
? ? private static File getIpaInfo(File oldfile) throws IOException {
? ? ? ? try{
? ? ? ? ? ? int byteread = 0;
? ? ? ? ? ? String filename = oldfile.getAbsolutePath().replaceAll(".ipa", ".zip");
? ? ? ? ? ? File newfile = new File(filename);
? ? ? ? ? ? if (oldfile.exists()){
? ? ? ? ? ? ? ? // 創(chuàng)建一個(gè)Zip文件
? ? ? ? ? ? ? ? InputStream inStream = new FileInputStream(oldfile);
? ? ? ? ? ? ? ? FileOutputStream fs = new FileOutputStream(newfile); ? ??
? ? ? ? ? ? ? ? byte[] buffer = new byte[1444]; ? ? ? ? ? ?
? ? ? ? ? ? ? ? while ((byteread = inStream.read(buffer)) != -1){
? ? ? ? ? ? ? ? ? ? fs.write(buffer,0,byteread); ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(inStream != null){
? ? ? ? ? ? ? ? ? ? inStream.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(fs != null){
? ? ? ? ? ? ? ? ? ? fs.close();?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 解析Zip文件
? ? ? ? ? ? ? ? return getZipInfo(newfile,newfile.getParent());
? ? ? ? ? ? } ? ? ? ? ??
? ? ? ? }catch(Exception e){ ? ? ??
? ? ? ? ? ? e.printStackTrace(); ? ?
? ? ? ? }
? ? ? ? return null;
? ? }
? ? /**
? ? ?* 通過(guò)IPA文件獲取Info信息
? ? ?* 這個(gè)方法可以重構(gòu),原因是指獲取了部分重要信息,如果想要獲取全部,那么應(yīng)該返回一個(gè)Map<String,Object>
? ? ?* 對(duì)于plist文件中的數(shù)組信息應(yīng)該序列化存儲(chǔ)在Map中,那么只需要第三發(fā)jar提供的NSArray可以做到!
? ? ?*/
? ? public static Map<String,String> getIpaInfoMap(File ipa) throws Exception{
? ? ? ? Map<String,String> map = new HashMap<String,String>();
? ? ? ? File file = getIpaInfo(ipa);
? ? ? ? // 第三方j(luò)ar包提供
? ? ? ? NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(file);
? ? ? ? // 應(yīng)用包名
? ? ? ? NSString parameters = (NSString)rootDict.objectForKey("CFBundleIdentifier");
? ? ? ? map.put("CFBundleIdentifier", parameters.toString());
? ? ? ? // 應(yīng)用名稱
? ? ? ? parameters = (NSString) rootDict.objectForKey("CFBundleName");
? ? ? ? map.put("CFBundleName", parameters.toString());
? ? ? ? // 應(yīng)用版本
? ? ? ? parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
? ? ? ? map.put("CFBundleShortVersionString", parameters.toString());
? ? ? ? // 應(yīng)用展示的名稱
? ? ? ? parameters = (NSString) rootDict.objectForKey("CFBundleDisplayName");
? ? ? ? map.put("CFBundleDisplayName", parameters!=null?parameters.toString():null);
? ? ? ? // 應(yīng)用所需IOS最低版本
? ? ? ? parameters = (NSString) rootDict.objectForKey("MinimumOSVersion");
? ? ? ? map.put("MinimumOSVersion", parameters.toString());
? ? ? ? //文件大小
? ? ? ? map.put("FileSize",String.valueOf(file.length()));
? ? ? ? // 如果有必要,應(yīng)該刪除解壓的結(jié)果文件
? ? ? ? file.delete();
? ? ? ? file.getParentFile().delete();
? ? ? ? return map;
? ? }
? ? /**
? ? ?* 生成plist文件,返回
? ? ?* @param map:ipa解析信息
? ? ?* @param downloadIpaPath:下載ipa文件路徑(https://xxx/xxx/x.ipa)
? ? ?* @param ipaFilePath:ipa文件存放路徑(/home/tomcat/xxx/x.ipa)
? ? ?* @return plist下載地址
? ? ?*/
? ? public static String createPlistXml(Map<String,String> map,String downloadIpaPath,String ipaFilePath){
? ? ? ? logger.info("==========開(kāi)始創(chuàng)建plist文件");
? ? ? ? //將.ipa文件變?yōu)?plist文件后綴
? ? ? ? ipaFilePath = ipaFilePath.replace(".ipa",".plist");
? ? ? ? File file = new File(ipaFilePath);
? ? ? ? if (!file.exists()) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? file.createNewFile();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? String icon = "http://xxx.oss-cn-beijing.aliyuncs.com/chemcn-ec-web/resources/chemcn-app/testApp/5d0b57f2b1696b03c1ca22ab/icon/com.ouyeel.nbapp_1.0.0_100_i.png";
? ? ? ? String plist = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
? ? ? ? ? ? ? ? +"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
? ? ? ? ? ? ? ? +"<plist version=\"1.0\">\n"
? ? ? ? ? ? ? ? +"<dict>\n"
? ? ? ? ? ? ? ? +"<key>items</key>\n"
? ? ? ? ? ? ? ? +"<array>\n"
? ? ? ? ? ? ? ? +"<dict>\n"
? ? ? ? ? ? ? ? +"<key>assets</key>\n"
? ? ? ? ? ? ? ? +"<array>\n"
? ? ? ? ? ? ? ? +"<dict>\n"
? ? ? ? ? ? ? ? +"<key>kind</key>\n"
? ? ? ? ? ? ? ? +"<string>software-package</string>\n"
? ? ? ? ? ? ? ? +"<key>url</key>\n"
? ? ? ? ? ? ? ? +"<string>"+downloadIpaPath+"</string>\n"
? ? ? ? ? ? ? ? +"<key>md5-size</key>\n"
? ? ? ? ? ? ? ? +"<integer>"+map.get("FileSize")+"</integer>\n"
? ? ? ? ? ? ? ? +"</dict>\n"
? ? ? ? ? ? ? ? +"<dict>\n"
? ? ? ? ? ? ? ? +"<key>kind</key>\n"
? ? ? ? ? ? ? ? +"<string>display-image</string>\n"
? ? ? ? ? ? ? ? +"<key>needs-shine</key>\n"
? ? ? ? ? ? ? ? +"<true/>\n"
? ? ? ? ? ? ? ? +"<key>url</key>\n"
? ? ? ? ? ? ? ? +"<string>"+icon+"</string>\n"
? ? ? ? ? ? ? ? +"</dict>\n"
? ? ? ? ? ? ? ? +"</array>\n"
? ? ? ? ? ? ? ? +"<key>metadata</key>\n"
? ? ? ? ? ? ? ? +"<dict>\n"
? ? ? ? ? ? ? ? +"<key>bundle-identifier</key>\n"
? ? ? ? ? ? ? ? +"<string>"+map.get("CFBundleIdentifier")+"</string>\n"
? ? ? ? ? ? ? ? +"<key>bundle-version</key>\n"
? ? ? ? ? ? ? ? +"<string>"+map.get("CFBundleShortVersionString")+"</string>\n"
? ? ? ? ? ? ? ? +"<key>kind</key>\n"
? ? ? ? ? ? ? ? +"<string>software</string>\n"
? ? ? ? ? ? ? ? +"<key>title</key>\n"
? ? ? ? ? ? ? ? +"<string>"+map.get("CFBundleName")+"</string>\n"
? ? ? ? ? ? ? ? +"</dict>\n"
? ? ? ? ? ? ? ? +"</dict>\n"
? ? ? ? ? ? ? ? +"</array>\n"
? ? ? ? ? ? ? ? +"</dict>\n"
? ? ? ? ? ? ? ? +"</plist>";
? ? ? ? FileOutputStream output = null;
? ? ? ? OutputStreamWriter writer = null;
? ? ? ? try {
? ? ? ? ? ? output = new FileOutputStream(file);
? ? ? ? ? ? writer = new OutputStreamWriter(output, "UTF-8");
? ? ? ? ? ? writer.write(plist);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? logger.error("==========創(chuàng)建plist文件異常:" + e.getMessage());
? ? ? ? }finally {
? ? ? ? ? ? if(writer != null){
? ? ? ? ? ? ? ? writer.close();
? ? ? ? ? ? }
? ? ? ? ? ? if(output != null){
? ? ? ? ? ? ? ? output.close();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? logger.info("==========成功創(chuàng)建plist文件");
? ? ? ? return downloadIpaPath.replaceAll(".ipa",".plist");
? ? }
? ? public static void main(String[] args) throws Exception {
? ? ? ? File file = new File("/Users/xuchuanjiang/Documents/temp/xxx-xxx-ios.ipa");
? ? ? ? Map<String,String> map = getIpaInfoMap(file);
? ? ? ? for(String key : map.keySet()){
? ? ? ? ? ? System.out.println(key+" : "+map.get(key));
? ? ? ? }
? ? ? ? createPlistXml(map,"https://xxx.xxx.com/ssx/static/xxx-xxx-ios.ipa","/Users/xuchuanjiang/Documents/temp/xxx-app-ios.ipa");
? ? }
}

3.提供下載的plist鏈接需要是https

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 帶你了解如何使用Spring基于ProxyFactoryBean創(chuàng)建AOP代理

    帶你了解如何使用Spring基于ProxyFactoryBean創(chuàng)建AOP代理

    這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • java中的按位與(&)用法說(shuō)明

    java中的按位與(&)用法說(shuō)明

    這篇文章主要介紹了java中的按位與(&)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java8 統(tǒng)計(jì)字符串字母?jìng)€(gè)數(shù)的幾種方法總結(jié)(推薦)

    java8 統(tǒng)計(jì)字符串字母?jìng)€(gè)數(shù)的幾種方法總結(jié)(推薦)

    下面小編就為大家分享一篇java8 統(tǒng)計(jì)字符串字母?jìng)€(gè)數(shù)的幾種方法總結(jié)(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)吧
    2017-11-11
  • SpringBoot配置Access-Control-Allow-Origin教程

    SpringBoot配置Access-Control-Allow-Origin教程

    文章介紹了三種配置Spring Boot跨域訪問(wèn)的方法:1. 使用過(guò)濾器;2. 在WebConfig配置文件中設(shè)置;3. 通過(guò)注解配置,作者分享了個(gè)人經(jīng)驗(yàn),并鼓勵(lì)讀者支持腳本之家
    2025-03-03
  • Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼

    Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼

    今天小編就為大家分享一篇關(guān)于Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Java 適配器模式從入門到實(shí)戰(zhàn)指南

    Java 適配器模式從入門到實(shí)戰(zhàn)指南

    這篇文章給大家介紹Java適配器模式從入門到實(shí)戰(zhàn)指南,本文從入門到實(shí)戰(zhàn),結(jié)合真實(shí)業(yè)務(wù)場(chǎng)景+可運(yùn)行代碼+面試高頻考點(diǎn),帶你吃透適配器模式,看完直接能用、能說(shuō)、能面試,新手也能快速上手
    2026-04-04
  • 使用Netty實(shí)現(xiàn)類似Dubbo的遠(yuǎn)程接口調(diào)用的實(shí)現(xiàn)方法

    使用Netty實(shí)現(xiàn)類似Dubbo的遠(yuǎn)程接口調(diào)用的實(shí)現(xiàn)方法

    本文介紹了如何使用Netty框架實(shí)現(xiàn)類似Dubbo的遠(yuǎn)程接口調(diào)用,通過(guò)自定義編解碼器、通信協(xié)議和服務(wù)注冊(cè)中心等實(shí)現(xiàn)遠(yuǎn)程通信和服務(wù)治理。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-04-04
  • 詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Java面試常考之ConcurrentHashMap多線程擴(kuò)容機(jī)制詳解

    Java面試??贾瓹oncurrentHashMap多線程擴(kuò)容機(jī)制詳解

    幾乎所有的后端技術(shù)面試官都要在?ConcurrentHashMap?技術(shù)的使用和原理方面對(duì)小伙伴們進(jìn)行刁難,本文主要來(lái)和大家聊聊ConcurrentHashMap多線程的擴(kuò)容機(jī)制,希望對(duì)大家有所幫助
    2023-05-05
  • spring security環(huán)境搭建

    spring security環(huán)境搭建

    本文通過(guò)代碼給大家介紹了spring security環(huán)境搭建的詳細(xì)教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09

最新評(píng)論

玉溪市| 天台县| 大丰市| 澎湖县| 洛浦县| 洛隆县| 大足县| 保定市| 祁连县| 三河市| 天门市| 嘉黎县| 大埔区| 行唐县| 如皋市| 蒙阴县| 洪洞县| 应用必备| 榆树市| 闽侯县| 南岸区| 轮台县| 赤峰市| 通化市| 石嘴山市| 星座| 比如县| 璧山县| 青冈县| 阿鲁科尔沁旗| 望城县| 桦甸市| 西宁市| 石棉县| 灵璧县| 定兴县| 汶川县| 政和县| 五莲县| 永兴县| 将乐县|