文件傳輸基礎——Java IO流

来源:http://www.cnblogs.com/Qian123/archive/2016/07/11/5632028.html
-Advertisement-
Play Games

一、文件的編碼 分析: * 1. “& 0xff”的解釋: * 0xFF表示的是16進位(十進位是255),表示為二進位就是“11111111”。 * 那麼&符表示的是按位數進行與(同為1的時候返回1,否則返回0) * 2.位元組byte與int類型轉換: * Integer.toHexString( ...


一、文件的編碼

 1 package com.study.io;
 2 
 3 
 4 /**
 5  * 測試文件編碼
 6  */
 7 public class EncodeDemo {
 8 
 9     /**
10      * @param args
11      * @throws Exception 
12      */
13     public static void main(String[] args) throws Exception {
14         String s="好好學習ABC";
15         byte[] bytes1=s.getBytes();//這是把字元串轉換成字元數組,轉換成的位元組序列用的是項目預設的編碼(這裡為UTF-8)
16         for (byte b : bytes1) {
17             //把位元組(轉換成了int)以16進位的方式顯示
18             System.out.print(Integer.toHexString(b & 0xff)+" ");//& 0xff是為了把前面的24個0去掉只留下後八位
19         }
20         System.out.println();
21         /*utf-8編碼中中文占用3個位元組,英文占用1個位元組*/
22         byte[] bytes2 = s.getBytes("utf-8");//這裡會有異常展示,我們就throw這個異常
23         for (byte b : bytes2) {
24             System.out.print(Integer.toHexString(b & 0xff)+" ");
25         }
26         System.out.println();
27         /*gbk編碼中文占用2個位元組,英文占用1個位元組*/
28         byte[] bytes3 = s.getBytes("gbk");//這裡會有異常展示,我們就throw這個異常
29         for (byte b : bytes3) {
30             System.out.print(Integer.toHexString(b & 0xff)+" ");
31         }
32         
33         System.out.println();
34         /*utf-16be編碼中文占用2個位元組,英文占用2個位元組*/
35         byte[] bytes4 = s.getBytes("utf-16be");//這裡會有異常展示,我們就throw這個異常
36         for (byte b : bytes4) {
37             System.out.print(Integer.toHexString(b & 0xff)+" ");
38         }
39         
40         System.out.println();
41         /*當你的位元組序列是某種編碼時,這個時候想把位元組序列變成字元串,也需要用這種編碼方式,否則會出現亂碼*/
42         String str1=new String(bytes4);//這時會使用項目預設的編碼來轉換,可能出現亂碼
43         System.out.println(str1);
44         //要使用位元組序列的編碼來進行轉換
45         String str2=new String(bytes4,"utf-16be");
46         System.out.println(str2);
47     }
48 }

分析:

* 1. “& 0xff”的解釋:
* 0xFF表示的是16進位(十進位是255),表示為二進位就是“11111111”。
* 那麼&符表示的是按位數進行與(同為1的時候返回1,否則返回0)

* 2.位元組byte與int類型轉換:
* Integer.toHexString(b & 0xff)這裡先把byte類型的b和0xff進行了運算,然後Integer.toHexString取得了十六進位字元串
* 可以看出b & 0xFF運算後得出的仍然是個int,那麼為何要和 0xFF進行與運算呢?直接 Integer.toHexString(b);,將byte強轉為int不行嗎?答案是不行的.
* 其原因在於:1.byte的大小為8bits而int的大小為32bits;2.java的二進位採用的是補碼形式
* Integer.toHexString的參數是int,如果不進行&0xff,那麼當一個byte會轉換成int時,由於int是32位,而byte只有8位這時會進行補位。。。。。。
* 所以,一個byte跟0xff相與會先將那個byte轉化成整形運算,這樣,結果中的高的24個比特就總會被清0,於是結果總是我們想要的。

* 3.utf-8編碼:中文占用3個位元組,英文占用1個位元組
* gbk編碼:中文占用2個位元組,英文占用1個位元組
* Java採用雙位元組編碼(就是Java中的一個字元占兩個位元組)是utf-16be編碼。中文占用2個位元組,英文占用2個位元組
*
* 4.當你的位元組序列是某種編碼時,這個時候想把位元組序列變成字元串,也需要用這種編碼方式,否則會出現亂碼

* 5.文本文件 就是位元組序列。可以是任意編碼的位元組序列。
* 如果我們在中文機器上直接創建文本文件,那麼該文件只認識ANSI編碼(例如直接在電腦中創建文本文件)

二、File類的使用

 1 package com.study.io;
 2 
 3 import java.io.File;
 4 
 5 /**
 6  * File類的使用
 7  */
 8 public class FileDemo {
 9     /*java.iO.File類表示文件或目錄
10     File類只用於表示文件或目錄的信息(名稱,大小等),不能用於文件內容的訪問。*/
11     public static void main(String[] args) {
12         File file=new File("D:\\111");//創建文件對象時指定目錄需要用雙斜杠,因為“\”是轉義字元
13         /*目錄的中間的分隔符可以用雙斜杠,也可以用反斜杠,也可以用File.separator設置分隔符*/
14 //        File file1=new File("d:"+File.separator);
15 //        System.out.println(file.exists());//exists()判斷文件或文件夾是否存在
16         if(!file.exists()){//如果文件不存在
17             file.mkdir();//創建文件夾mkdir(),還有mkdirs()創建多級目錄
18         }else{
19             file.delete();//刪除文件或文件夾
20         }
21         //判斷是否是一個目錄isDirectory,如果是目錄返回true,如果不是目錄或者目錄不存在返回false
22         System.out.println(file.isDirectory());
23         //判斷是否是一個文件isFile
24         System.out.println(file.isFile());
25         
26         File file2=new File("D:\\222","123.txt");
27         //常用API:
28         System.out.println(file);//列印的是file.toString()的內容
29         System.out.println(file.getAbsolutePath());//獲取絕對路徑
30         System.out.println(file.getName());//獲取文件名稱
31         System.out.println(file2.getName());
32         System.out.println(file.getParent());//獲取父級絕對路徑
33         System.out.println(file2.getParentFile().getAbsolutePath());
34     }
35 }

運行結果:

說明:

java.iO.File類表示文件或目錄
File類只用於表示文件或目錄的信息(名稱,大小等),不能用於文件內容的訪問。
常用的API:
1.創建File對象:File file=new File(String path);註意:File.seperater();獲取系統分隔符,如:“\”.
2.boolean file.exists();是否存在.
3.file.mkdir();或者file.mkdirs();創建目錄或多級目錄。
4.file.isDirectory()判斷是否是目錄
file.isFile()判斷是否是文件。
5.file.delete();刪除文件或目錄。
6.file.createNewFile();創建新文件。
7.file.getName()獲取文件名稱或目錄絕對路徑。
8.file.getAbsolutePath()獲取絕對路徑。
9.file.getParent();獲取父級絕對路徑。

 ❤❤1、遍歷目錄

 1 package com.study.io;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 /**
 7  * File工具類
 8  * 列出File類的常用操作,比如:過濾、遍歷等操作
 9  */
10 public class FileUtils {
11     /**
12      * 列出指定目錄下(包括其子目錄)的所有文件
13      * @param dir
14      * @throws IOException
15      */
16     public static void listDirectory(File dir) throws IOException{
17         if(!dir.exists()){//exists()方法用於判斷文件或目錄是否存在
18             throw new IllegalArgumentException("目錄:"+dir+"不存在");
19         }
20         if(!dir.isDirectory()){//isDirectory()方法用於判斷File類的對象是否是目錄
21             throw new IllegalArgumentException(dir+"不是目錄");
22         }
23         /*String[] fileNames = dir.list();//list()方法用於列出當前目錄下的子目錄和文件(直接是子目錄的名稱,不包含子目錄下的內容),返回的是字元串數組
24         for (String string : fileNames) {
25             System.out.println(string);
26         }*/
27         
28         //如果要遍歷子目錄下的內容就需要構造成File對象做遞歸操作,File提供了直接返回File對象的API
29         File[] listFiles = dir.listFiles();//返回的是直接子目錄(文件)的抽象
30         if(listFiles !=null && listFiles.length >0){
31             for (File file : listFiles) {
32                 /*System.out.println(file);*/
33                 if(file.isDirectory()){
34                     //遞歸
35                     listDirectory(file);
36                 }else{
37                     System.out.println(file);
38                 }
39             }
40         }
41     }
42 }

測試類:

1 public class FileUtilsTest1 {
2     public static void main(String[] args) throws IOException {
3         FileUtils.listDirectory(new File("D:\\ioStudy"));
4     }
5 }

運行結果:

三、RandomAccessFile類的使用

RandomAccessFile:java提供的對文件內容的訪問,既可以讀文件,也可以寫文件。
RandomAccessFile支持隨機訪問文件,可以訪問文件的任意位置。

註意 Java文件的模型:

運行結果:

0
1
6
12
[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -42, -48]
41 
42 
7f 
ff 
ff 
ff 
7f 
ff 
ff 
ff 
d6 
d0 
View Code

四、位元組流(FileInputStream、FileOutputStream)

IO流可分為輸入流和輸出流。

這裡又可分為位元組流和字元流。

 代碼示例:

  1 package com.study.io;
  2 
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 
 10 /**
 11  * IO工具類
 12  * ❤文件輸入輸出流:
 13  * FileInputStream-->具體實現了在文件上讀取數據
 14  * FileOutputStream-->實現了向文件中寫出byte數據的方法
 15  * ❤數據輸入輸出流:
 16  * DataOutputStream / DataInputStream:對"流"功能的擴展,可以更加方面的讀取int,long,字元等類型數據
 17  * DataOutputStream  writeInt()/writeDouble()/writeUTF()
 18  * ❤位元組緩衝流:
 19  * BufferedInputStream & BufferedOutputStream
 20  * 這兩個流類位IO提供了帶緩衝區的操作,一般打開文件進行寫入或讀取操作時,都會加上緩衝,這種流模式提高了IO的性能 
 21  * 比如:從應用程式中把輸入放入文件,相當於將一缸水倒入到另一個缸中:
 22      FileOutputStream--->write()方法相當於一滴一滴地把水“轉移”過去
 23      DataOutputStream-->writeXxx()方法會方便一些,相當於一瓢一瓢把水“轉移”過去
 24      BufferedOutputStream--->write方法更方便,相當於一瓢一瓢先放入桶中(即緩存區),再從桶中倒入到另一個缸中,性能提高了
 25  */
 26 public class IOUtil {
 27     
 28     /**
 29      * 讀取指定文件內容,按照16進位輸出到控制台
 30      * 並且每輸出10個byte換行
 31      * @param fileName
 32      * 單位元組讀取不適合大文件,大文件效率很低
 33      */
 34     public static void printHex(String fileName)throws IOException{
 35         //把文件作為位元組流進行都操作
 36         FileInputStream in=new FileInputStream(fileName);
 37         int b;
 38         int i=1;
 39         while((b=in.read())!=-1){
 40             /* 0xff換成2進位就是8個1,這樣與的話,其實就是取到了字元的低8位。 
 41              * oxf就是15, 小於15的數會轉換成一個16進位數,
 42              * 你的代碼里希望是固定的兩個16進位數,所以當只會產生一個時要加個0*/
 43             if(b <= 0xf){
 44                 //單位數前面補0
 45                 System.out.print("0");
 46             }
 47             //Integer.toHexString(b)將整型b轉換為16進位表示的字元串
 48             System.out.print(Integer.toHexString(b)+" ");
 49             if(i++%10==0){
 50                 System.out.println();
 51             }
 52         }
 53         in.close();//文件讀寫完成以後一定要關閉
 54     }
 55 
 56     /**
 57      * 批量讀取,對大文件而言效率高,也是我們最常用的讀文件的方式
 58      * @param fileName
 59      * @throws IOException
 60      */
 61     public static void printHexByByteArray(String fileName)throws IOException{
 62         FileInputStream in = new FileInputStream(fileName);
 63         byte[] buf = new byte[8 * 1024];
 64         /*從in中批量讀取位元組,放入到buf這個位元組數組中,
 65          * 從第0個位置開始放,最多放buf.length個 
 66          * 返回的是讀到的位元組的個數
 67          */
 68         /*int bytes = in.read(buf,0,buf.length);//一次性讀完,說明位元組數組足夠大
 69      int j = 1; 
 70      for(int i = 0; i < bytes;i++){
 71       System.out.print(Integer.toHexString(buf[i] & 0xff)+"  ");
 72       if(j++%10==0){
 73        System.out.println();
 74       }
 75      }*/
 76         int bytes = 0;
 77         int j = 1;
 78         while((bytes = in.read(buf,0,buf.length))!=-1){
 79             for(int i = 0 ; i < bytes;i++){
 80                 System.out.print(Integer.toHexString(buf[i] & 0xff)+"  ");
 81                 /**
 82                  * & 0xff:byte類型8位,int類型32位,為了避免數據轉換錯誤,通過&0xff將高24位清零
 83                  */
 84                 if(j++%10==0){
 85                     System.out.println();
 86                 }
 87             }
 88         }
 89         in.close();
 90     }
 91     
 92     /**
 93      * 文件拷貝,位元組批量讀取
 94      * @param srcFile
 95      * @param destFile
 96      * @throws IOException
 97      */
 98     public static void copyFile(File srcFile, File destFile) throws IOException {
 99         if (!srcFile.exists()) {
100             throw new IllegalArgumentException("文件:" + srcFile + "不存在");
101         }
102         if (!srcFile.isFile()) {
103             throw new IllegalArgumentException(srcFile + "不是文件");
104         }
105         FileInputStream in = new FileInputStream(srcFile);
106         FileOutputStream out = new FileOutputStream(destFile);//文件不存在時,會直接創建;如果存在,刪除後建
107         byte[] buf = new byte[8 * 1024];//批量讀寫
108         int b;
109         while ((b = in.read(buf, 0, buf.length)) != -1) {//read(buf,0,buf.length)帶參數的read返回的是位元組的總長度;當全部讀完後返回的是-1;
110             out.write(buf, 0, b);
111             out.flush();// 最好加上
112         }
113         in.close();
114         out.close();
115     }
116     
117     /**
118      * 進行文件的拷貝,利用帶緩衝的位元組流
119      * @param srcFile
120      * @param destFile
121      * @throws IOException
122      */
123     public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{
124         if(!srcFile.exists()){
125             throw new IllegalArgumentException("文件:"+srcFile+"不存在");
126         }
127         if(!srcFile.isFile()){
128             throw new IllegalArgumentException(srcFile+"不是文件");
129         }
130         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
131         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
132         int c ;
133         while((c = bis.read())!=-1){
134             bos.write(c);
135             bos.flush();//刷新緩衝區
136         }
137         bis.close();
138         bos.close();
139     }
140     
141     /**
142      * 單位元組,不帶緩衝進行文件拷貝
143      * @param srcFile
144      * @param destFile
145      * @throws IOException
146      */
147     public static void copyFileByByte(File srcFile,File destFile)throws IOException{
148         if(!srcFile.exists()){
149             throw new IllegalArgumentException("文件:"+srcFile+"不存在");
150         }
151         if(!srcFile.isFile()){
152             throw new IllegalArgumentException(srcFile+"不是文件");
153         }
154         FileInputStream in = new FileInputStream(srcFile);
155         FileOutputStream out = new FileOutputStream(destFile);
156         int c ;
157         while((c = in.read())!=-1){//read()不帶參數的read返回的是讀到的位元組內容;當全部讀完後返回的都是是-1;
158             out.write(c);
159             out.flush();
160         }
161         in.close();
162         out.close();
163     }
164 }

測試類:

package com.study.io;


import java.io.File;
import java.io.IOException;

import org.junit.Test;

public class IOUtilTest {

    @Test
    public void testPrintHex() {
        try {
            IOUtil.printHex("D:\\Javaio\\FileUtils.java");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testPrintHexByByteArray() {
        try {
            long start = System.currentTimeMillis();//當前時間與協調世界時 1970 年 1 月 1 日午夜之間的時間差(以毫秒為單位測量)
            //IOUtil.printHexByByteArray("e:\\javaio\\FileUtils.java");
            //IOUtil.printHex("e:\\javaio\\1.mp3");
            IOUtil.printHexByByteArray("e:\\javaio\\1.mp3");
            System.out.println();
            long end = System.currentTimeMillis();
            System.out.println(end - start);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
   @Test
   public void testCopyFile(){
       try {
           IOUtil.copyFile(new File("d:\\javaio\\1.txt"), new File("d:\\javaio\\1copy.txt"));
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

   @Test
   public void testCopyFileByBuffer(){
       try {
           long start = System.currentTimeMillis();
           /*IOUtil.copyFileByByte(new File("e:\\javaio\\1.mp3"), new File(
             "e:\\javaio\\2.mp3"));*/  //兩萬多毫秒
           /*IOUtil.copyFileByBuffer(new File("e:\\javaio\\1.mp3"), new File(
             "e:\\javaio\\3.mp3"));//一萬多毫秒*/
           IOUtil.copyFile(new File("e:\\javaio\\1.mp3"), new File(
             "e:\\javaio\\4.mp3"));//7毫秒
           long end = System.currentTimeMillis();
           System.out.println(end - start );
          } catch (IOException e) {
           e.printStackTrace();
          } 
   }
}

五、字元流

 

 1 package com.study.io;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 
 9 public class IsrAndOswDemo {
10     public static void main(String[] args)throws IOException {
11         FileInputStream in = new FileInputStream("e:\\javaio\\utf8.txt");
12         InputStreamReader isr = new InputStreamReader(in,"utf-8");//預設項目的編碼,操作的時候,要寫文件本身的編碼格式
13 
14         FileOutputStream out = new FileOutputStream("e:\\javaio\\utf81.txt");
15         OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
16         /*int c ;
17   while((c = isr.read())!=-1){
18    System.out.print((char)c);
19   }*/
20         char[] buffer = new char[8*1024];
21         int c;
22         /*批量讀取,放入buffer這個字元數組,從第0個位置開始放置,最多放buffer.length個返回的是讀到的字元的個數*/
23         while(( c = isr.read(buffer,0,buffer.length))!=-1){
24             String s = new String(buffer,0,c);
25             System.out.print(s);
26             osw.write(buffer,0,c);
27             osw.flush();
28         }
29         isr.close();
30         osw.close();
31 
32     }
33 
34 }

 ❤ 字元流之文件讀寫流(FileReader/FileWriter) 

❤ 字元流的過濾器

六、對象的序列化和反序列化

示例:

 註意:

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.網站地址:http://www.freeboygirl.com2.網站Asp .Net Core 資料http://www.freeboygirl.com/blog/tag/asp%20net%20core3.各類最新Asp .Net Core 項目和示例源碼​ github.com/freeb ...
  • Windows10 IoT Core 使用 C#創建 IoT設備應用程式,通過應用程式創建IoT設備本地SQLite資料庫,並創建數據表,執行插入、更新、刪除數據等操作。 ...
  • 這個效果我不太會描述 PlaceHolder直譯占位符 也有人把這個效果叫水印效果 就是和HTML5的PlaceHolder屬性一樣的效果 上圖直觀: 使用方法: 首先下載 占位符行為dll.rar 在項目中引用dll 1.在VS中 引用System.Windows.Interactivity.dl ...
  • 在觸屏設備上,手指滑動頁面,或者單擊導航選項時,增加導航下橫線滑動的效果: 這個版本有點簡單粗暴,同事在項目中優化了一下演算法。這裡只是簡單記錄一下大致思路: 1、導航使用 ListView 控制項,下麵使用 Pivot 控制項 大致結構為: 頁面中的 ListView: 選中時,播放的位移動畫: Piv ...
  • 主要介紹相干衍射成像(coherent diffractive imaging,CDI),以及其中用到的各種相位恢復演算法,包含幾何光學、傅里葉光學、泛函、最優化理論方面的東西。會以 MATLAB 和 OpenCV 兩種方式公佈代碼。 MATLAB代碼是我過去幾年的工作成果,主要是想重寫成OpenCV ...
  • scanf是很敏感的,最好不要在scanf下做精度、場寬的設置,否則輸入可能會失效。 例: #include <stdio.h> int main(void){ int a = 0; scanf("%5d",&a); printf("a = %d",a); return 0;} 我運行這個代碼,在輸 ...
  • 1.安裝 版本說明:Win10+R3.2.5+JKD1.7+eclipse-jee-mars-R-win32-x86_64 2.R中調用Java 載入rJava包,運行library(rJava),註意:在一個會話中,包只需載入一次。如果需要,你可以自定義啟動環境以自動載入會頻繁使用的那些包,下麵是 ...
  • 有以下文本 要求匹配 註釋外的內容,匹配之後的內容: aaa bbb ddd eee hhh 可以利用/^xxx/../^xxx/結構來匹配 ,但是出現了以下的嵌套結構: aaa bbb #if defined(lxx_mmi_del) ccc #endif ddd eee #if defined( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...