IO【轉換流,列印流,序列化】

来源:http://www.cnblogs.com/caigq/archive/2017/06/22/7049104.html
-Advertisement-
Play Games

編碼: 把看的懂,變成看不懂的 String str = "中國"; byte[] bytes = str.getBytes(); System.out.println(Arrays.toString(bytes));解碼: 把看不懂的內容,變成能看懂的 String s = new String( ...


編碼:

把看的懂,變成看不懂的
String str = "中國";
byte[] bytes = str.getBytes();
System.out.println(Arrays.toString(bytes));
解碼:

把看不懂的內容,變成能看懂的
String s = new String(bytes);
System.out.println(s);


java.io.OutputStreamWriter extends Writer
OutputStreamWriter:轉換流
作用:是字元流通向位元組流的橋梁,可以指定編碼表

繼承自父類Writer的公共成員方法
寫一個字元,寫字元數組,寫字元數組的一部分,寫字元串,寫字元的一部分,刷新,關閉

構造方法:
OutputStreamWriter(OutputStream out, String charsetName) 創建使用指定字元集的 OutputStreamWriter。
參數:
OutputStream out:位元組輸出流(把轉換後的位元組寫入到文件中)
可以傳入FileOutputStream
String charsetName:編碼表名稱
可以傳入一個字元串格式的編碼表名稱,比如"GBK","utf-8"...,編碼表名稱不區分大小寫,如果不寫預設為系統碼表

使用步驟:
1.創建字元輸出流FileOutputStream,綁定數據的目的地
2.創建轉換流OutputStreamWriter對象,構造方法中傳入FileOutputStream和指定的編碼表名稱
3.調用OutputStreamWriter中寫數據的方法,把數據寫入到記憶體緩衝區中
4.釋放資源,並把數據刷新到文件中

 1 public static void main(String[] args) throws IOException {
 2         //write_GBK();
 3         write_UTF8();
 4     }
 5 
 6     /*
 7      * 使用轉換流OutputStreamWriter,寫UTF-8格式的文件
 8      */
 9     private static void write_UTF8() throws IOException {
10         //1.創建字元輸出流FileOutputStream,綁定數據的目的地
11         FileOutputStream fos = new FileOutputStream("utf-8.txt");
12         //2.創建轉換流OutputStreamWriter對象,構造方法中傳入FileOutputStream和指定的編碼表名稱
13         OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
14         //3.調用OutputStreamWriter中寫數據的方法,把數據寫入到記憶體緩衝區中
15         osw.write("你好");
16         //4.釋放資源,並把數據刷新到文件中
17         osw.close();
18     }
19 
20     /*
21      * 使用轉換流OutputStreamWriter,寫GBK格式的文件
22      */
23     private static void write_GBK() throws IOException {
24         //1.創建字元輸出流FileOutputStream,綁定數據的目的地
25         FileOutputStream fos = new FileOutputStream("gbk.txt");
26         //2.創建轉換流OutputStreamWriter對象,構造方法中傳入FileOutputStream和指定的編碼表名稱
27         //OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
28         OutputStreamWriter osw = new OutputStreamWriter(fos);
29         //3.調用OutputStreamWriter中寫數據的方法,把數據寫入到記憶體緩衝區中
30         osw.write("你好");
31         //4.釋放資源,並把數據刷新到文件中
32         osw.close();
33     }

java.io.InputStreamReader extends Reader
* InputStreamReader流:是位元組流通向字元流的橋梁,可以指定編碼表
*
* 繼承自父類Reader的公共的成員方法
* int read() 讀取單個字元。
* int read(char[] cbuf) 將字元讀入數組。
* abstract void close() 關閉該流並釋放與之關聯的所有資源。
*
* 構造方法:
* InputStreamReader(InputStream in) 創建一個使用預設字元集的 InputStreamReader。
* InputStreamReader(InputStream in, String charsetName) 創建使用指定字元集的 InputStreamReader。
* 參數:
* InputStream in:位元組輸入流(把文件中保存的位元組讀取出來)
* 可以傳入FileInputStream
* String charsetName:編碼表名稱
* 可以傳入一個字元串格式的編碼表名稱,比如"GBK","utf-8"...,編碼表名稱不區分大小寫,如果不寫預設為系統碼表
*
* 使用步驟:
* 1.創建位元組輸入流FileInputStream對象,綁定數據源
* 2.創建轉換流InputStreamReader對象,構造方法中,傳入FileInputStream和指定的編碼表名稱
* 3.使用InputStreamReader讀取數據的方法,讀取數據
* 4.釋放資源
*
* 註意:構造方法中指定的編碼名稱,必須和要讀取的文件保持一致,否則會出現亂碼

 1 public static void main(String[] args) throws IOException {
 2         //read_GBK();
 3         read_UTF8();
 4     }
 5 
 6     /*
 7      * 使用InputStreamReader讀取UTF-8格式文件
 8      */
 9     private static void read_UTF8() throws IOException {
10         //1.創建位元組輸入流FileInputStream對象,綁定數據源
11         FileInputStream fis = new FileInputStream("utf-8.txt");
12         //2.創建轉換流InputStreamReader對象,構造方法中,傳入FileInputStream和指定的編碼表名稱
13         //InputStreamReader isr = new InputStreamReader(fis,"GBK");//亂碼:浣犲ソ
14         InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//你好
15         //3.使用InputStreamReader讀取數據的方法,讀取數據
16         //int read() 讀取單個字元。 
17         int len = 0;
18         while((len = isr.read())!=-1){
19             System.out.print((char)len);
20         }
21         //4.釋放資源
22         isr.close();
23     }
24 
25     /*
26      * 使用InputStreamReader讀取GBK格式文件
27      */
28     private static void read_GBK() throws IOException {
29         //1.創建位元組輸入流FileInputStream對象,綁定數據源
30         FileInputStream fis = new FileInputStream("gbk.txt");
31         //2.創建轉換流InputStreamReader對象,構造方法中,傳入FileInputStream和指定的編碼表名稱
32         //InputStreamReader isr = new InputStreamReader(fis,"GBK");
33         InputStreamReader isr = new InputStreamReader(fis);//不指定,預設使用GBK
34         //3.使用InputStreamReader讀取數據的方法,讀取數據
35         //int read() 讀取單個字元。 
36         int len = 0;
37         while((len = isr.read())!=-1){
38             System.out.print((char)len);
39         }
40         //4.釋放資源
41         isr.close();
42     }

對象的序列化和反序列化
* 對象的序列化:把對象以流的方式寫入到文件中保存
* 對象的反序列化:把文件中保存的對象,以流的方式讀取出來
對象的反序列化:把文件中保存的對象,以流的方式讀取出來
*
* 構造方法:
* ObjectInputStream(InputStream in) 創建從指定 InputStream 讀取的 ObjectInputStream。
* 參數:
* InputStream in:位元組流,可以傳入FileInputStream
*
* 讀對象的方法:
* Object readObject() 從 ObjectInputStream 讀取對象。
*
* 使用步驟:
* 1.創建位元組輸入流FileInputStream,綁定數據源
* 2.創建反序列化流ObjectInputStream,構造方法中傳入FileInputStream
* 3.使用ObjectInputStream中的方法readObject,讀取文件中保存的對象
* 4.釋放資源
* 5.列印對象
*
* 註意:
* 方法readObject,會拋出ClassNotFoundException(沒有class文件異常)
* 反序列化的前提,必須有對象的class文件存在
對象的序列化:把對象以流的方式寫入到文件中保存
* 構造方法:
* ObjectOutputStream(OutputStream out) 創建寫入指定 OutputStream 的 ObjectOutputStream。
* 參數:
* OutputStream out:位元組流,可以傳入FileOutputStream
*
* 寫對象的方法:
* void writeObject(Object obj) 將指定的對象寫入 ObjectOutputStream。
*
* 使用步驟:
* 1.創建對象,並賦值
* 2.創建位元組輸出流對象FileOutputStream,綁定數據目的地
* 3.創建序列化流ObjectOutputStream對象,構造方法中傳入FileOutputStream
* 4.使用ObjectOutputStream中的方法writeObject,把對象寫入到文件中
* 5.釋放資源
*
* 註意:
* 要序列化的類如果沒有實現Serializable介面,會拋出NotSerializableException異常
*/
類通過實現 java.io.Serializable 介面以啟用其序列化功能。未實現此介面的類將無法使其任何狀態序列化或反序列化

Serializable介面:稱之為標記型介面
類只有實現了Serializable才能序列化和反序列化,不實現就不能
去市場賣肉,肉上有一個藍色的戳(檢測合格),買回去乾什麼有不同的吃的方式
java.lang.Cloneable:標記型介面
類實現了Cloneable就能複製,不實現就不能

序列化和反序列的是對象,如果對象中有靜態的屬性,可以序列化嗎?
靜態屬於類,不屬於對象,不能序列化
不管是靜態屬性和非靜態屬性都有預設值
age預設值是0,又是靜態屬性,不能序列化,使用預設值0
瞬態關鍵字transient:作用,阻止成員變數序列化

列印流:
* 位元組列印流:PrintStream extends OutputStream
* 字元列印流:PrintWriter extends Writer
*
* 兩個列印流中的方法,完全一致:
* void print(Object obj): 輸出任意類型的數據,
* void println(Object obj): 輸出任意類型的數據,自動寫入換行操作
*
* 構造方法,就是列印流的輸出目的端
* PrintStream
* 構造方法目的地:接收File類型,接收字元串文件名,接收位元組輸出流OutputStream
* PrintWriter
* 構造方法目的地:接收File類型,接收字元串文件名,接收位元組輸出流OutputStream,
* 接收字元輸出流Writer
*
* 註意事項:
* 位元組流寫入數據的時候,會直接把數據寫入到文件中
* 字元流寫入數據的時候,會把數據寫入到記憶體緩衝區中,必須刷新或者關閉,才會把數據由緩衝區刷新到文件中
*/''

 1 public static void main(String[] args) throws IOException {
 2         System.out.println(97);
 3         method_04();
 4     }
 5 
 6     /*
 7      * 字元列印流的自動刷新功能
 8      * 自動刷新功能的使用必須滿足3個條件:
 9      *     1.字元列印流的輸出的目的地必須是一個流對象(字元,位元組)
10      *     2.字元列印流構造方法的參數autoFlush必須是true
11      *     3.必須使用 println、printf 或 format 方法中的一個才能實現
12      * 
13      * 包含自動刷新的構造方法:
14      *     PrintWriter(OutputStream out, boolean autoFlush) 
15      *  PrintWriter(Writer out, boolean autoFlush) 
16      *  
17      * 我們可以把字元串的目的地和File類的目的地轉換為流,開啟自動刷新 
18      */
19     private static void method_04() throws IOException {
20         PrintWriter pw = new PrintWriter(new FileWriter("6.txt"),true);
21         pw.print("不能自動刷新");
22         pw.println("會自動把緩衝區中所有的內容刷新到文件中");
23     }
24 
25     /*
26      * 列印流,輸出目的地,是流對象
27      * 可以是位元組輸出流,也可以是字元輸出流
28      * OutputStream Writer
29      */
30     private static void method_03() throws IOException {
31         FileOutputStream fos = new FileOutputStream("3.txt");
32         ////The constructor PrintStream(FileWriter) is undefined
33         //PrintStream ps = new PrintStream(new FileWriter("3.txt"));
34         PrintStream ps = new PrintStream(fos);
35         ps.println("位元組列印流的輸出目的地是一個位元組流");
36         ps.close();
37         
38         PrintWriter pw = new PrintWriter(new FileOutputStream("4.txt"));
39         pw.println("字元列印流的輸出目的地是一個位元組流");
40         pw = new PrintWriter(new FileWriter("5.txt"));
41         pw.println("字元列印流的輸出目的地是一個字元流");
42         pw.close();
43     }
44 
45     /*
46      * 列印流,輸出目的,String文件名
47      */
48     private static void method_02() throws FileNotFoundException {
49         PrintWriter pw = new PrintWriter("2.txt");
50         pw.println("字元列印流,必須的刷新");
51         //pw.flush();
52         pw.close();
53     }
54 
55     /*
56      * 列印流,向File文件對象的數據目的地寫入數據
57      * 方法 print println 原樣輸出
58      * write方法 走編碼表
59      */
60     private static void method_01() throws FileNotFoundException {
61         File file = new File("1.txt");
62         PrintStream ps = new PrintStream(file);
63         //使用繼承自父類的write方法寫入數據
64         ps.write(97);
65         //使用自己特有的方法println/print寫入數據
66         ps.println(97);
67         ps.println(true);
68         ps.println("hello");
69         ps.println(8.8);
70         ps.println('中');
71         ps.close();
72     }

字元列印流的自動刷新功能
自動刷新功能的使用必須滿足3個條件:
1.字元列印流的輸出的目的地必須是一個流對象(字元,位元組)
2.字元列印流構造方法的參數autoFlush必須是true
3.必須使用 println、printf 或 format 方法中的一個才能實現

包含自動刷新的構造方法:
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)

我們可以把字元串的目的地和File類的目的地轉換為流,開啟自動刷新
列印流,輸出目的地,是流對象
可以是位元組輸出流,也可以是字元輸出流
OutputStream Writer

java.io.Properties集合 extends Hashtable implements Map介面
*
* Properties集合的特點:
* 1.健和值預設都是String類型
* 2.集合中有自己特有的方法
* Object setProperty(String key, String value) 調用 Hashtable 的方法 put。
* String getProperty(String key) 用指定的鍵在此屬性列表中搜索屬性。 相當於Map集合中的get(key k)方法
* Set<String> stringPropertyNames() 返回此屬性列表中的鍵集. 相當於Map集合中的的keySet
* 3.和IO流相結合的方法
* 使用store方法把集合中保存的臨時數據,持久化到硬碟的文件中保存
* void store(OutputStream out, String comments)
* void store(Writer writer, String comments)
* 使用load方法把硬碟文件中保存的鍵值對,讀取出來,放入到Properties集合中
* void load(InputStream inStream)
* void load(Reader reader)

 1 public static void main(String[] args) throws IOException {
 2         method_03();
 3     }
 4 
 5     /*
 6      * 使用load方法把硬碟文件中保存的鍵值對,讀取出來,放入到Properties集合中  
 7      *     void load(InputStream inStream)
 8      *     void load(Reader reader)
 9      *     方法的參數:
10      *         InputStream inStream:不能讀取包含中文的鍵值對
11      *         Reader reader:可以讀取包含中文的鍵值對
12      * 
13      * 使用步驟:
14      *     1.創建Properties集合
15      *     2.創建位元組輸入流/字元輸入對象,綁定數據源
16      *     3.使用Properties中的方法load,讀取文件中保存的鍵值對,把鍵值對保存到集合中
17      *     4.釋放資源
18      *     5.遍歷Properties集合
19      * 
20      * 註意:
21      *         prop.properties文件中使用#號可以註釋一行
22      *         prop.properties文件中key和value預設就是字元不用使用""
23      *         prop.properties文件中key和value之間可以使用=連接也可以使用空格
24      */
25     private static void method_03() throws IOException {
26         //1.創建Properties集合
27         Properties prop = new Properties();
28         //2.創建位元組輸入流/字元輸入對象,綁定數據源
29         FileReader fr = new FileReader("prop.properties");
30         //3.使用Properties中的方法load,讀取文件中保存的鍵值對,把鍵值對保存到集合中
31         prop.load(fr);
32         //4.釋放資源
33         fr.close();
34         //5.遍歷Properties集合
35         for(String key : prop.stringPropertyNames()){
36             String value = prop.getProperty(key);
37             System.out.println(key+"="+value);
38         }
39     }
40 
41     /*
42      * 使用store方法把集合中保存的臨時數據,持久化到硬碟的文件中保存
43      *     void store(OutputStream out, String comments)  
44      *     void store(Writer writer, String comments)
45      *     方法的參數:
46      *         OutputStream out:不能操作中文
47      *         Writer writer:可以操作中文
48      *         String comments:註釋,保存數據的用途,可以寫"",不能寫中文,預設使用unicode編碼
49      * 使用步驟:
50      *     1.創建Properties集合,添加數據
51      *     2.創建位元組輸出流或者字元輸出流對象,綁定目的地
52      *     3.使用Properties集合中的方法store把集合中的數據,寫入到文件中
53      *     4.釋放資源
54      */
55     private static void method_02() throws IOException {
56         //1.創建Properties集合,添加數據
57         Properties prop = new Properties();
58         prop.setProperty("a", "1");
59         prop.setProperty("b", "2");
60         prop.setProperty("中國", "1");
61         //2.創建位元組輸出流或者字元輸出流對象,綁定目的地
62         FileWriter fw = new FileWriter("prop.properties");
63         //3.使用Properties集合中的方法store把集合中的數據,寫入到文件中
64         prop.store(fw, "");
65         //4.釋放資源
66         fw.close();
67         
68         FileOutputStream fos = new FileOutputStream("prop1.properties");
69         prop.store(fos, "save date");//寫入中文會出現亂碼
70         fos.close();
71     }
72 
73     /*
74      * 使用Properties集合中特有的方法,保存數據,遍歷集合
75      */
76     private static void method_01() {
77         Properties prop = new Properties();
78         //Object setProperty(String key, String value) 調用 Hashtable 的方法 put。 
79         prop.setProperty("a", "1");
80         prop.setProperty("b", "2");
81         prop.setProperty("c", "3");
82         
83         //Set<String> stringPropertyNames() 返回此屬性列表中的鍵集.  相當於Map集合中的的keySet 
84         Set<String> set = prop.stringPropertyNames();
85         
86         //遍歷Set集合
87         for (String key : set) {
88             //String getProperty(String key) 用指定的鍵在此屬性列表中搜索屬性。  相當於Map集合中的get(key k)方法
89             String value = prop.getProperty(key);
90             System.out.println(key+"..."+value);
91         }
92     }

 

使用load方法把硬碟文件中保存的鍵值對,讀取出來,放入到Properties集合中
* void load(InputStream inStream)
* void load(Reader reader)
* 方法的參數:
* InputStream inStream:不能讀取包含中文的鍵值對
* Reader reader:可以讀取包含中文的鍵值對
*
* 使用步驟:
* 1.創建Properties集合
* 2.創建位元組輸入流/字元輸入對象,綁定數據源
* 3.使用Properties中的方法load,讀取文件中保存的鍵值對,把鍵值對保存到集合中
* 4.釋放資源
* 5.遍歷Properties集合
*
* 註意:
* prop.properties文件中使用#號可以註釋一行
* prop.properties文件中key和value預設就是字元不用使用""
* prop.properties文件中key和value之間可以使用=連接也可以使用空格
*/
使用store方法把集合中保存的臨時數據,持久化到硬碟的文件中保存
* void store(OutputStream out, String comments)
* void store(Writer writer, String comments)
* 方法的參數:
* OutputStream out:不能操作中文
* Writer writer:可以操作中文
* String comments:註釋,保存數據的用途,可以寫"",不能寫中文,預設使用unicode編碼
* 使用步驟:
* 1.創建Properties集合,添加數據
* 2.創建位元組輸出流或者字元輸出流對象,綁定目的地
* 3.使用Properties集合中的方法store把集合中的數據,寫入到文件中
* 4.釋放資源

使用commons-IO中提供的工具類FileUtils
* static readFileToString(File file):讀取文件內容,並返回一個String;
* static writeStringToFile(File file,String content):將內容content寫入到file中;
* static copyFile(File srcFile, File destFile): 文件複製
* static copyDirectoryToDirectory(File srcDir,File destDir);文件夾複製
*
* 方法都是靜態方法,可以通過類名直接使用
* 方法的參數都是File類型

 1 public static void main(String[] args) throws IOException {
 2         //static readFileToString(File file):讀取文件內容,並返回一個String;
 3         //String s = FileUtils.readFileToString(new File("prop.properties"));
 4         String s = FileUtils.readFileToString(new File("src/cn/itcsat/demo01/Demo01FileReader.java"));
 5         System.out.println(s);
 6         
 7         //static writeStringToFile(File file,String content):將內容content寫入到file中;
 8         FileUtils.writeStringToFile(new File("fileUitls.txt"), "FileUtils工具類的時候");
 9         
10         //static copyFile(File srcFile, File destFile): 文件複製
11         FileUtils.copyFile(new File("c:\\1.jpg"), new File("d:\\1.jpg"));
12         
13         //static copyDirectoryToDirectory(File srcDir,File destDir);文件夾複製
14         FileUtils.copyDirectoryToDirectory(new File("c:\\demo"),new File("d:"));
15     }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.根據單個分隔字元用split截取 例如 即可得到sArray[0]="GT123",sArray[1]="1"; 2.利用多個字元來分隔字元串 例如 得到sArray[0]="GTAZB",sArray[1]="Jiang",sArray[2]="Ben",sArray[3]="123"; 3根 ...
  • 在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作後能夠定位到其中指定的控制項處;這很像在 HTML 頁面中點擊一個鏈接後定位到當前網頁上的某個 anchor。 要實現它,首先我們需要看 ScrollViewer 為我們提供的 ...
  • TypeInfo,PropertyInfo,MethodInfo,FieldInfo ...
  • 在這篇博客中,我們將介紹如下內容: ==運算符與基元類型 ==運算符與引用類型 ==運算符與String類型 ==運算符與值類型 ==運算符與泛型 ==運算符與基元類型 我們分別用兩種方式比較兩個整數,第一個使用的是Equals(int)方法,每二個使用的是==運算符: 運行上面的示例,兩個語句出的 ...
  • 微軟利用OAuth2為RESTful API提供了完整的鑒權機制,但是可能微軟保姆做的太完整了,在這個機制中指定了數據持久化的方法是用EF,而且對於用戶、許可權等已經進行了封裝,對於系統中已經有了自己的用戶表,和不是採用EF做持久化的系統來說限制太大,不自由,而且現實中很多情況下,授權伺服器和資源服務 ...
  • 背水一戰 Windows 10 之 控制項(集合類 - ItemsControl): SemanticZoom, ISemanticZoomInformation ...
  • 隨著公司業務的不斷變化,幾年前的 A 項目和底層 DB_A 資料庫華麗轉身為核心業務服務和核心資料庫。 想從 DB_A 資料庫獲取數據的 web 服務越來越多,項目之間的關係逐漸演變為下麵這樣: 很容易看出來按上圖這樣的發展趨勢會存在很多問題(項目關係為個人抽象出來的簡化版,實際情況比這要複雜的多) ...
  • 關於AbstractQueuedSynchronizer JDK1.5之後引入了併發包java.util.concurrent,大大提高了Java程式的併發性能。關於java.util.concurrent包我總結如下: AbstractQueuedSynchronizer是併發類諸如Reentra ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...