第四节:IO、序列化和反序列化、加密解密技术

一. IO读写  

  这里主要包括文件的读、写、移动、复制、删除、文件夹的创建、文件夹的删除等常规操作。

注意:这里需要特别注意,对于普通的控制台程序和Web程序,将"相对路径"转换成"绝对路径"的方法不一致。

(1). 在web程序中,可以使用HttpContext.Current.Server.MapPath进行转换,使用方法通过 ~/定位到一级目录,eg:FileOperateHelp.Write_Txt("~/TestFile/mr.txt", "mr")。

(2). 在普通的控制台程序中,HttpContext.Current为空,所以web中的转换方式在控制台中失效,需要借助 "AppDomain.CurrentDomain.BaseDirectory"来获取根目录,该目录直接定位到Debug文件夹,然后利用System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath)传入路径与根目录进行结合,所以普通的控制台程序生成的所有文件均在Debug文件夹下,当然,你也可以直接写绝对路径,比如D:xxx。

   下面的方法就是专门处理普通程序和web程序路径转换问题的。

复制代码

 1         /// <summary>2         /// 10.将相对路径转换成绝对路径3         /// </summary>4         /// <param name="strPath">相对路径</param>5         public static string PathConvert(string strPath)6         {7             //web程序使用8             if (HttpContext.Current != null)9             {
10                 return HttpContext.Current.Server.MapPath(strPath);
11             }
12             else //非web程序引用             
13             {
14                 strPath = strPath.Replace("/", "\\");
15                 if (strPath.StartsWith("\\"))
16                 {
17                     strPath = strPath.TrimStart('\\');
18                 }
19                 return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
20             }
21         }

复制代码

 

下面分享一个FileOperateHelp类,里面包含IO的常规操作。

 View Code

1. 在控制台中进行调用。

复制代码

 1                //1.写文件测试(覆盖写入)2                 FileOperateHelp.Write_Txt("TestFile/mr.txt", "mr123");3                 FileOperateHelp.Write_Txt("TestFile/mr2.txt", "mr123");4                 //2.读文件测试5                 string msg1 = FileOperateHelp.Read_Txt("TestFile/mr.txt");6 7                 //3.写文件测试(追加写入)8                 FileOperateHelp.WriteFile("TestFile/mr.txt", "123456");9                 //4.读文件测试
10                 string msg2 = FileOperateHelp.ReadFile("TestFile/mr.txt");
11 
12                 //5.删除文件测试
13                 FileOperateHelp.FileDel("TestFile/mr2.txt");
14 
15                 //6.移动文件测试
16                 FileOperateHelp.FileMove("TestFile/mr.txt", "TestFile/TEST/mr移动.txt");
17 
18                 //7.复制文件测试
19                 FileOperateHelp.FileCopy("TestFile/mr3.txt", "TestFile/TEST/mr3Copy.txt");
20 
21                 //8.创建文件夹
22                 FileOperateHelp.FolderCreate("TestFile/TEST2");
23 
24                 //9.递归删除文件夹(删除a文件夹)
25                 FileOperateHelp.DeleteFolder("TestFile/TestDel/a/");                

复制代码

2. 在Web程序中进行调用

复制代码

 1  public void Index()2         {3             //1.写文件测试(覆盖写入)4             FileOperateHelp.Write_Txt("~/TestFile/mr.txt", "mr123");5             FileOperateHelp.Write_Txt("~/TestFile/mr2.txt", "mr123");6             //2.读文件测试7             string msg1 = FileOperateHelp.Read_Txt("~/TestFile/mr.txt");8 9             //3.写文件测试(追加写入)
10             FileOperateHelp.WriteFile("~/TestFile/mr.txt", "123456");
11             //4.读文件测试
12             string msg2 = FileOperateHelp.ReadFile("~/TestFile/mr.txt");
13 
14             //5.删除文件测试
15             FileOperateHelp.FileDel("~/TestFile/mr2.txt");
16 
17             //6.移动文件测试
18             FileOperateHelp.FileMove("~/TestFile/mr.txt", "~/TestFile/TEST/mr移动.txt");
19 
20             //7.复制文件测试
21             FileOperateHelp.FileCopy("~/TestFile/mr3.txt", "~/TestFile/TEST/mr3Copy.txt");
22 
23             //8.创建文件夹
24             FileOperateHelp.FolderCreate("~/TestFile/TEST2");
25 
26             //9.递归删除文件夹(删除a文件夹)
27             FileOperateHelp.DeleteFolder("~/TestFile/TestDel/a/");
28 
29         }

复制代码

二. 序列化和反序列化

1. 在.Net中,序列化和反序列化主要有两种 :

  方案一:利用JavaScriptSerializer对象实现,需要添加System.Web.Extensions程序集的引用。

  方案二:利用程序集Newtonsoft.Json.dll来实现。

注意:如果要把某个类序列化,需要在该类上面加一个 [Serializable]属性。

下面分享一个JsonHelp类,该类主要提供两种序列化和反序列化的方法,代码如下:

复制代码

 1   public class JsonHelp2     {3         #region 01-将JSON转换成JSON字符串4         /// <summary>5         /// 将JSON转换成JSON字符串6         /// </summary>7         /// <typeparam name="T"></typeparam>8         /// <param name="obj"></param>9         /// <returns></returns>
10         public static string ObjectToString<T>(T obj)
11         {
12             JavaScriptSerializer jss = new JavaScriptSerializer();
13             return jss.Serialize(obj);
14         }
15         #endregion
16 
17         #region 02-将字符串转换成JSON对象
18         /// <summary>
19         /// 将字符串转换成JSON对象
20         /// </summary>
21         /// <typeparam name="T"></typeparam>
22         /// <param name="content"></param>
23         /// <returns></returns>
24         public static T StringToObject<T>(string content)
25         {
26             JavaScriptSerializer jss = new JavaScriptSerializer();
27             return jss.Deserialize<T>(content);
28         }
29         #endregion
30 
31         #region 03-将JSON转换成JSON字符串
32         /// <summary>
33         ///将JSON转换成JSON字符串
34         /// </summary>
35         /// <typeparam name="T"></typeparam>
36         /// <param name="obj"></param>
37         /// <returns></returns>
38         public static string ToJsonString<T>(T obj)
39         {
40             return JsonConvert.SerializeObject(obj);
41         }
42         #endregion
43 
44         #region 04-将字符串转换成JSON对象
45         /// <summary>
46         /// 将字符串转换成JSON对象
47         /// </summary>
48         /// <typeparam name="T"></typeparam>
49         /// <param name="content"></param>
50         /// <returns></returns>
51         public static T ToObject<T>(string content)
52         {
53             return JsonConvert.DeserializeObject<T>(content);
54         } 
55         #endregion
56     }

复制代码

  2. 代码调用:

复制代码

 1                 //1. 将JSON对象转换成JSON字符串2                 Console.WriteLine("-------------------------------------1. 将JSON转换成JSON字符串------------------------------------------");3                 var myObj = new4                 {5                     id = "1",6                     name = "ypf",7                     myList = studentList,8                     myList2 = studentList.Where(u => u.Age > 27).Select(u => new9                     {
10                         t1 = u.Age,
11                         t2 = u.ClassId
12                     }).ToList()
13 
14                 };
15                 //1.1 方式一
16                 string myString1 = JsonHelp.ObjectToString(myObj);
17                 //1.2 方式二
18                 string myString2 = JsonHelp.ToJsonString(myObj);
19                 string myString3 = JsonHelp.ToJsonString(studentList);
20                 Console.WriteLine(myString1);
21                 Console.WriteLine(myString2);
22                 //2. 将JSON字符串转换成JSON对象(必须显式的声明对象)
23                 List<Student> myList = JsonHelp.StringToObject<List<Student>>(myString3);
24                 Console.WriteLine(myList);

复制代码

三. 加密和解密

这里介绍三种加密方式,分别是:

(1). MD5不可逆加密:加密后可以是16位,也可以是32位,任何语言的MD5加密后的结果都相同。

(2). DES可逆对称加密:

  优点:对称加密算法的优点是速度快。

  缺点:密钥管理不方便,要求共享密钥。

  特点:不同写法对应的加密值不同。

(3). RSA可逆非对称加密:          

  特点:可逆非对称加密,需要两个Key,公钥和私钥,每次产生的公钥和私钥不一致,加密的结果就不一致

  好处:非对称加密算法的优点是密钥管理很方便,缺点是速度慢。

  特性(重点!!!):需要通过代码来生成一对公钥(加密key)和私钥(解密key),公钥私钥只与是否公开有关。

     A. 如果公开公钥(加密key):只有我接受加密信息才有用,因为只有我有私钥(解密key),能解密。

    B. 如果公开私钥(解密key):用于签名,表示加密数据一定是我发的,因为只有公钥(加密key)。

1. 下面分享两种MD5实现的算法

复制代码

         /// <summary>/// MD5加密,和动网上的16/32位MD5加密结果相同,/// 使用的UTF8编码/// </summary>/// <param name="strSource">待加密字串</param>/// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>/// <returns>加密后的字串</returns>public static string Encrypt(string source, int length = 32)//默认参数{HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;if (string.IsNullOrEmpty(source)) return string.Empty;byte[] bytes = Encoding.UTF8.GetBytes(source);// Encoding.ASCII.GetBytes(source);byte[] hashValue = provider.ComputeHash(bytes);StringBuilder sb = new StringBuilder();switch (length){case 16://16位密文是32位密文的9到24位字符for (int i = 4; i < 12; i++)sb.Append(hashValue[i].ToString("x2"));break;case 32:for (int i = 0; i < 16; i++){sb.Append(hashValue[i].ToString("x2"));}break;default:for (int i = 0; i < hashValue.Length; i++){sb.Append(hashValue[i].ToString("x2"));}break;}return sb.ToString();} /// <summary>/// MD5加密/// </summary>/// <param name="str">要加密的字符串</param>/// <returns>加密后的字符串</returns>public static string Md5(string str){var md5 = MD5.Create();// 计算字符串的散列值var bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(str));var sbd = new StringBuilder();foreach (var item in bytes){sbd.Append(item.ToString("x2"));}return sbd.ToString();}

复制代码

2. 下面分享两种DES实现的算法

复制代码

 1  public class DesEncrypt2     {3         //8位长度4         private static string KEY = "ypf12345";5         private static byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(KEY.Substring(0, 8));6         private static byte[] rgbIV = ASCIIEncoding.ASCII.GetBytes(KEY.Insert(0, "w").Substring(0, 8));7 8         #region 01-DES加密9         /// <summary>
10         /// DES 加密
11         /// </summary>
12         /// <param name="strValue">需要加密的字符串</param>
13         /// <returns></returns>
14         public static string Encrypt(string strValue)
15         {
16             DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
17             using (MemoryStream memStream = new MemoryStream())
18             {
19                 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
20                 StreamWriter sWriter = new StreamWriter(crypStream);
21                 sWriter.Write(strValue);
22                 sWriter.Flush();
23                 crypStream.FlushFinalBlock();
24                 memStream.Flush();
25                 return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
26             }
27         } 
28         #endregion
29 
30         #region 02-DES解密
31         /// <summary>
32         /// DES解密
33         /// </summary>
34         /// <param name="EncValue">加密后的结果</param>
35         /// <returns></returns>
36         public static string Decrypt(string EncValue)
37         {
38             DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
39             byte[] buffer = Convert.FromBase64String(EncValue);
40 
41             using (MemoryStream memStream = new MemoryStream())
42             {
43                 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
44                 crypStream.Write(buffer, 0, buffer.Length);
45                 crypStream.FlushFinalBlock();
46                 return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
47             }
48         } 
49         #endregion
50     }

复制代码

复制代码

 1  #region 3.DES加密一个字符串(可逆,非固定)2         /// <summary>3         /// 加密一个字符串(可逆,非固定)4         /// </summary>5         /// <param name="str">要加密的字符串</param>6         /// <param name="key">加密密钥</param>7         /// <returns>加密后的字符串</returns>8         public static string EncryptStr(string str, string key = "iceStone")9         {
10             var des = DES.Create();
11             // var timestamp = DateTime.Now.ToString("HHmmssfff");
12             var inputBytes = Encoding.UTF8.GetBytes(MixUp(str));
13             var keyBytes = Encoding.UTF8.GetBytes(key);
14             SHA1 ha = new SHA1Managed();
15             var hb = ha.ComputeHash(keyBytes);
16             var sKey = new byte[8];
17             var sIv = new byte[8];
18             for (var i = 0; i < 8; i++)
19                 sKey[i] = hb[i];
20             for (var i = 8; i < 16; i++)
21                 sIv[i - 8] = hb[i];
22             des.Key = sKey;
23             des.IV = sIv;
24             using (var ms = new MemoryStream())
25             {
26                 using (var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
27                 {
28                     cs.Write(inputBytes, 0, inputBytes.Length);
29                     cs.FlushFinalBlock();
30                     var ret = new StringBuilder();
31                     foreach (var b in ms.ToArray())
32                     {
33                         ret.AppendFormat("{0:X2}", b);
34                     }
35 
36                     return ret.ToString();
37                 }
38             }
39         }
40         #endregion
41 
42         #region 4.DES解密一个字符串
43         /// <summary>
44         /// 解密一个字符串
45         /// <param name="str">要解密的字符串</param>
46         /// <param name="key">加密密钥</param>
47         /// <returns>解密后的字符串</returns>
48         public static string DecryptStr(string str, string key = "iceStone")
49         {
50             var des = DES.Create();
51             var inputBytes = new byte[str.Length / 2];
52             for (var x = 0; x < str.Length / 2; x++)
53             {
54                 inputBytes[x] = (byte)System.Convert.ToInt32(str.Substring(x * 2, 2), 16);
55             }
56             var keyByteArray = Encoding.UTF8.GetBytes(key);
57             var ha = new SHA1Managed();
58             var hb = ha.ComputeHash(keyByteArray);
59             var sKey = new byte[8];
60             var sIv = new byte[8];
61             for (var i = 0; i < 8; i++)
62                 sKey[i] = hb[i];
63             for (var i = 8; i < 16; i++)
64                 sIv[i - 8] = hb[i];
65             des.Key = sKey;
66             des.IV = sIv;
67             using (var ms = new MemoryStream())
68             {
69                 using (var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
70                 {
71                     cs.Write(inputBytes, 0, inputBytes.Length);
72                     cs.FlushFinalBlock();
73                     return ClearUp(Encoding.UTF8.GetString(ms.ToArray()));
74                 }
75             }
76         }
77         #endregion

复制代码

3. 下面分享RSA的代码

复制代码

 1  public class RsaEncrypt2     {3 4         #region 01-生成公钥和私钥5         /// <summary>6         /// 生成公钥和私钥7         /// </summary>8         /// <returns></returns>9         public static KeyValuePair<string, string> GetKeyPair()
10         {
11             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
12             string publicKey = RSA.ToXmlString(false);
13             string privateKey = RSA.ToXmlString(true);
14             return new KeyValuePair<string, string>(publicKey, privateKey);
15         } 
16         #endregion
17 
18         #region 02-加密(传入内容和公钥)
19         /// <summary>
20         /// 加密:内容+公钥,事先需要生成公钥和私钥
21         /// </summary>
22         /// <param name="content">加密内容</param>
23         /// <param name="publicKey">公钥</param>
24         /// <returns></returns>
25         public static string Encrypt(string content, string publicKey)
26         {
27             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
28             rsa.FromXmlString(publicKey);
29             UnicodeEncoding ByteConverter = new UnicodeEncoding();
30             byte[] DataToEncrypt = ByteConverter.GetBytes(content);
31             byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
32             return Convert.ToBase64String(resultBytes);
33         } 
34         #endregion
35 
36         #region 03-加密(并返回公钥和私钥)
37         /// <summary>
38         /// 加密(并返回公钥和私钥),在该方法中生成了公钥和私钥,并返回
39         /// </summary>
40         /// <param name="content">加密内容</param>
41         /// <param name="publicKey">返还公钥</param>
42         /// <param name="privateKey">返回密钥</param>
43         /// <returns>加密后结果</returns>
44         public static string Encrypt(string content, out string publicKey, out string privateKey)
45         {
46             RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
47             publicKey = rsaProvider.ToXmlString(false);
48             privateKey = rsaProvider.ToXmlString(true);
49             UnicodeEncoding ByteConverter = new UnicodeEncoding();
50             byte[] DataToEncrypt = ByteConverter.GetBytes(content);
51             byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false);
52             return Convert.ToBase64String(resultBytes);
53         } 
54         #endregion
55 
56         #region 04-解密(内容+私钥)
57         /// <summary>
58         /// 解密-内容+私钥
59         /// </summary>
60         /// <param name="content"></param>
61         /// <param name="privateKey"></param>
62         /// <returns></returns>
63         public static string Decrypt(string content, string privateKey)
64         {
65             byte[] dataToDecrypt = Convert.FromBase64String(content);
66             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
67             RSA.FromXmlString(privateKey);
68             byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
69             UnicodeEncoding ByteConverter = new UnicodeEncoding();
70             return ByteConverter.GetString(resultBytes);
71         } 
72         #endregion
73     }

复制代码

4. 分享加密算法的调用代码

复制代码

 1  {2                 Console.WriteLine("-------------------------------------三.3种加密方式------------------------------------------");3                 {4                     Console.WriteLine("----------------------1.MD5加密(加密后结果可以是32位,也可以是16位,主流都采用32位)-----------------------------");5                     //1.MD5加密(加密后结果可以是32位,也可以是16位,主流都采用32位)6                     //1.1 写法一7                     string msg1 = "mr1";8                     string result1 = MD5Encrypt.Encrypt(msg1);9                     string result2 = MD5Encrypt.Encrypt(msg1, 16);
10                     Console.WriteLine(result1);
11                     Console.WriteLine(result2);
12                     //1.2 写法二   .Net 高度封装的MD5方法
13                     string result3 = SecurityHelp.Md5(msg1);
14                     Console.WriteLine(result3);
15                 }
16                 {
17                     Console.WriteLine("----------------------2.对称可逆加密算法DES-----------------------------");
18                     //2.对称加密算法DES
19                     string msg1 = "mr1";
20                     //2.1 写法一:密钥写在DesEncrypt类中了,密钥为ypf12345
21                     string result1 = DesEncrypt.Encrypt(msg1);
22                     string result2 = DesEncrypt.Decrypt(result1);
23                     Console.WriteLine(result1);
24                     Console.WriteLine(result2);
25                     //2.2 写法二
26                     string result3 = SecurityHelp.EncryptStr(msg1, "ypf12345");
27                     string result4 = SecurityHelp.DecryptStr(result3, "ypf12345");
28                     Console.WriteLine(result3);
29                     Console.WriteLine(result4);
30                 }
31                 {
32                     Console.WriteLine("----------------------3.非对称可逆加密算法RSA-----------------------------");
33                     //方式一:先生成公钥和私钥,然后加密和解密
34                     //KeyValuePair是一个键值对, myKey.Key 代表的公钥;myKey.Value 代表的私钥
35                     KeyValuePair<string, string> myKey = RsaEncrypt.GetKeyPair();
36                     string msg1 = "mr1";
37                     //加密
38                     string result1 = RsaEncrypt.Encrypt(msg1, myKey.Key);
39                     //解密
40                     string result2 = RsaEncrypt.Decrypt(result1, myKey.Value);
41                     Console.WriteLine(result1);
42                     Console.WriteLine(result2);
43                     //方式二:直接加密,并通过out参数的形式返回公钥和私钥
44                     string publicKey = "";
45                     string privateKey = "";
46                     //加密
47                     string result3 = RsaEncrypt.Encrypt(msg1, out publicKey, out privateKey);
48                     //解密
49                     string result4 = RsaEncrypt.Decrypt(result3, privateKey);
50                     Console.WriteLine(result3);
51                     Console.WriteLine(result4);
52                 }
53 
54             }

复制代码

 运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java mediator_java—mediator中介模式

中介者模式是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一&#xff0c;Mediator模式定义:用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立的改变他们之间的交互。适用性…

第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)

一. 泛型诞生的背景 在介绍背景之前&#xff0c;先来看一个案例&#xff0c;要求&#xff1a;分别输出实体model1、model2、model3的id和name值,这三个实体有相同的属性名字id和name。 1 public class myUtils2 {3 //要求&#xff1a;分别输出实体model1、model2、…

第六节:反射(几种写法、好处和弊端、利用反射实现IOC)

一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法&#xff1a;Load、LoadFile、LoadFrom。 1       //1.1 Load方法&#xff1a;动态默认加载当前路径下的(bin)下的dll文件,不需要后缀 2 Assembly assembly Assembly.Load(&…

第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

一. 语法糖简介 语法糖也译为糖衣语法&#xff0c;是由英国计算机科学家彼得约翰兰达&#xff08;Peter J. Landin&#xff09;发明的一个术语&#xff0c;指计算机语言中添加的某种语法&#xff0c;这种语法对语言的功能并没有影响&#xff0c;但是更方便程序员使用。通常来说…

java不用插件播放媒体文件_java servlet不用插件上传文件:

展开全部import java.net.*;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class SaveFileServlet extends HttpServlet{FileWriter savefile;String filename null;String value null;/*** Handles a POST request*/publ…

第八节:语法总结(2)(匿名类、匿名方法、扩展方法)

一. 匿名类 1. 传统的方式给类赋值&#xff0c;需要先建一个实体类→实例化→赋值&#xff0c;步骤很繁琐&#xff0c;在.Net 3.0时代&#xff0c;微软引入匿名类的概念&#xff0c;简化了代码编写&#xff0c;提高了开发效率。 匿名类的声明语法&#xff1a; var objnew {字段…

java 里面matches什么意思_Java Regex中的matches()和find()之间的区别

如果完整string匹配&#xff0c; matches()将只返回true。 find()会尝试find匹配正则expression式的子string中的下一个匹配项。 注意强调“下一个”。 这意味着&#xff0c;多次调用find()的结果可能不一样。 另外&#xff0c;通过使用find()你可以调用start()来返回子string匹…

第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

一. 委托的发展历史和基本用法 说起委托&#xff0c;每个人可能都会对他有不同的理解&#xff0c;结合实战中委托的使用&#xff0c;我对其理解是&#xff1a;委托和类一样&#xff0c;是用户的一个自定义类型&#xff0c;委托可以有参数、有返回值&#xff0c;委托的关键字是d…

java为什么不使用odbc_java jdbc和odbc的区别是什么?jdbc和odbc的关系是怎样的?

对于jdbc和odbc你都了解多少呢?今天要给大家讲到的就是jdbc和odbc之间的内容&#xff0c;一起来了解一下jdbc和odbc的区别以及关系是怎样的吧!下面先来给大家介绍一下jdbc和odbc之间的区别。总的来说&#xff0c;jdbc和odbc的区别可以划分成三大部分&#xff0c;一起来看看。一…

第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

一. 泛型委托 所谓的泛型委托&#xff0c;即自定义委托的参数可以用泛型约束&#xff0c;同时内置委托Func和Action本身就是泛型委托。 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下。 1 public class Calculator22 {3 //传统解决方案一&am…

java中sql之count_按SQL Server中的count()子句分组

我正在尝试编写一个SQL查询&#xff0c;它将返回聚合值列表;但是&#xff0c;我想通过其中一个聚合值(计数)对查询进行分组&#xff1a;select t.Field1, count(distinct(t.Field2), SUM(t.Value1)from MyTable tgroup by t.Field1, count(t.Field2)我已经尝试将计数放入子查询…

java+sm4+加密算法_SM4加密算法实现Java和C#相互加密解密

https://www.cnblogs.com/miaoziblog/p/9040473.html近期由于项目需要使用SM4对数据进行加密&#xff0c;然后传给Java后台&#xff0c;Java后台使用的也是SM4的加密算法但是就是解密不正确&#xff0c;经过一步步调试发现Java中好多数据类型与C#的相同的数据类型是存在不同的比…

用java设计节拍器_具有高速的Java节拍器

关于Thread.sleep()不可靠的答案是正确的&#xff1a;你不能指望它完全返回你指定的时间.事实上,我很惊讶你的节拍器可以使用,特别是当你的系统负载不足时.阅读Thread.sleep()的文档以获取更多详细信息.关于MIDI的Max Beikirch的答案是一个很好的建议&#xff1a;MIDI处理时机非…

java隐藏密钥_java – 在Android中隐藏密钥库密码的最佳方法是什么?

我是Android开发和实现SSLSockets的新手.在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端.我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本.这是客户端的一些代码.如您所见,我将密码硬编码到本地var中.是否有更好的方法加载密钥库密码,所以我…

DotNet进阶系列

一. 回顾历史 回顾个人发展历程&#xff0c;自2012年初次接触开发至今(2018年)已经有六个年头&#xff0c;这期间陆陆续续学习并掌握了不少技术&#xff0c;C#语言、ORM框架、多线程技术、设计模式、前端技术、MVC、MVVM框架思想等等&#xff0c;每种技术随着多次使用&#xff…

美团科技 Java工程师_美团Java工程师面试题(2018秋招)

第一次面试1.小数是怎么存的2.算法题&#xff1a;N二进制有多少个13.Linux命令(不熟悉4.JVM垃圾回收算法5.C或者伪代码实现复制算法6.volatile7.树的先序中序后序以及应用场景8.Mysql存储记录的数据结构9.索引数据结构10.为什么不用AVL和红黑树存&#xff1f;11.说实习项目12.r…

第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)

一. 基本概念 1. 什么是特性? MSDN官方给出的定义时&#xff1a;公共语言运行时允许添加类似关键字的描述声明&#xff0c;叫做特性&#xff0c;它对程序中的元素进行标注&#xff0c;如类型、字段、方法和属性等。Attribute和Microsoft .Net Framework文件的元数据&#xff…

java不建议用全局变量吗_不要使用全局变量, ThreadLocal也不行

不要使用全局变量的道理大家都懂&#xff0c;基本上在大家学习编程过程中很早就会被教育到&#xff0c;但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量&#xff0c;只不过这些全局变量会穿上马甲&#xff0c;让你不会一下看穿它的巨大危害&#xff0c;这里就讲一下我…

第十二节:Lambda、linq、SQL的相爱相杀(1)

一. 谈情怀 Lambda、Linq、SQL伴随着我的开发一年又一年&#xff0c;但它们三者并没有此消彼长&#xff0c;各自占有这一定的比重&#xff0c;起着不可替代的作用。 相信我们最先接触的应该就是SQL了&#xff0c;凡是科班出身的人&#xff0c;大学期间都会学习SQL Server数据库…

php java 共享session_PHP 实现多服务器共享 SESSION 数据

一、问题起源稍大一些的网站&#xff0c;通常都会有好几个服务器&#xff0c;每个服务器运行着不同功能的模块&#xff0c;使用不同的二级域名&#xff0c;而一个整体性强的网站&#xff0c;用户系统是统一的&#xff0c;即一套用户名、密码在整个网站的各个模块中都是可以登录…