JavaEE-文件IO2

文章目錄

  • 前言
  • 一、字節流
    • 1.1 讀文件
    • 1.2 寫文件
  • 二、字符流
    • 2.1 讀文件
    • 2.2 寫文件
  • 三、文件IO三道例題


前言

在這里對Java標準庫中對文件內容的操作進行總結,總體上分為兩部分,字節流和字符流,就是以字節為單位讀取文件和以字符為單位讀取文件內容。


一、字節流

1.1 讀文件

字節流在Java中的類就是InputStream,他是一個抽象類,我們在這里操作的文件所以就需要通過它的子類FileInputStream向上轉型的方式,因為InputStream不能初始化。后面如果我們要進行網絡IO,就也是使用相對應的子類來進行實現。
代碼示例1:

package io;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class Demo6 {public static void main(String[] args) throws IOException {
//         讀文件的兩種不同參數的read方法的使用
//        InputStream inputStream = new FileInputStream("F:/test.txt");
//        while (true) {
//            int b = inputStream.read();
//            if (b == -1) {
//                break;
//            }
//            System.out.printf("0x%x ", b);
//        }
//        System.out.println();//        while (true) {
//            byte[] arrB = new byte[1024];
//            int n = inputStream.read(arrB);
//            System.out.println("n = " + n);
//            if(n==-1) {
//                //讀畢 n就會返回-1
//                // 在這里首先第一次會把數組填滿 后面第二次循環文件內沒字節了就返回-1
//                break;
//            }
//            for (int i = 0; i < n; i++) {
//                System.out.printf("0x%x ", arrB[i]);
//
//            }
//            System.out.println();
//        }
//
//    }      }}

這段代碼是使用字節流來讀取文件內容的一個簡單過程,因為我們讀取硬盤中的文件內容給內存中的變量去接受,顯然數據是往cpu的方向流動的,因此是一個輸入的過程,我們使用InputStream抽象類以及FileInputStream類進行向上轉型來構造這樣的一個字節流對象。我們想要讀取哪個文件中的信息就可以將文件的路徑或者File類對象用以初始化字節流對象,如下。

InputStream inputStream = new FileInputStream("F:/test.txt");

FileInputStream這樣的字節流對象提供了一些讀取文件數據的方法如下圖。
在這里插入圖片描述
這三種方法有些許的不同,首先read方法,它每次讀取一個字節,然后返回值就是就是這個字節的相應的ASCII值,如果說讀到文件末尾那么此時就會返回-1。那么既然每次都是讀一個字節,返回的就是一個字節的范圍,那么返回值類型直接設為byte即可,那么為什么會設為int類型的返回呢?
有以下幾點原因:
(1)確保每次返回的數都是正數,因為從原則上說字節這樣的概念本身是無符號的但是byte類型本身是有符號的,如果說你拿byte來返回無符號數,那么范圍是0~255,此時就無法表示-1。只有你使用int類型,才能夠返回值是正數,還能使用-1來表示文件結尾。
(2)這時我們又會想到,那么我們直接用short不就行了,這樣也就可以包含-1以及0到255的整數。但是這里就涉及到計算機發展的問題了,因為計算機發展到現在存儲空間不再是核心矛盾了,存儲設備的成本是越來越便宜了,此時隨著cpu越來越牛,它單次處理數據的長度也越來越長。對于32位cpu,一次就能夠處理四個字節的數據,此時要是使用short還要將其轉成int再按int進行處理,顯然64位cpu也是類似的,此時的short就更沒意義了,我們學過的c語言中的整形提升也是類似的道理。因此在我們使用short的場景換成int,在我們使用float的場景我們換成double。
這里補充一下,為什么說字節數據從原則上是無符號的,因為字節數據不是用來進行算數運算的,例如一張圖片就是由很多字節數據構成的,如果對其字節進行加一或者減一操作,那么這張圖像很可能直接崩掉
第二個read方法和第一個read方法不同的點在于它的參數是一個字節數組,這個數組是一個空數組,讀文件數據的時候就會把讀到的數據全放到這個數組當中,去把這個字節數組給填滿,能填多少填多少。返回值也是類似,你讀到多少個字節就返回多少,讀到文件尾就返回-1。
第三個read方法其實和第二個read方法就很類似了,也是建立一個空數組來作為參數,然后指定一個區間,讀到的文件數據只放到這個空數組的對應區間當中。返回值就和第二個read方法一樣了,讀到多少字節就返回多少,讀到文件尾就返回-1。
這里提一嘴,read()和read(byte[] b)這兩種方法誰的效率比較高?
事實上是第二個方法的效率高,我們都知道第一個方法是一次讀取一個字節,第二個方法是一次讀一個數組的字節,對于固定的文件內容,肯定是第二個方法讀取的次數比較少,文件的IO在我們的代碼中是一個比較低效的操作,每次讀取都要進行一次IO,顯然IO次數少的方法效率就更高。
此時我們把視角轉回上面的代碼示例1,我們分別使用方法1和方法2來讀取文件數據,然后在外面套一個死循環,當read方法返回-1代表讀到文件尾此時跳出循環,邏輯還是比較簡單的。
代碼示例2:

package io;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class Demo6 {public static void main(String[] args) throws IOException {// 但是每當建立一個線程或進程 建立的PCB中的文件描述符表這個順序表它的長度是有限的// 每當打開一個文件 它的長度就要加一、// 所以打開文件后要及時關閉// 所以這里聯想到處理unlock()的方法 即使用try finally語句
//        InputStream inputStream = new FileInputStream("F:/test.txt");
//        try {
//            while (true) {
//                byte[] arrB = new byte[1024];
//                int n = inputStream.read(arrB);
//                System.out.println("n = " + n);
//                if (n == -1) {
//                    //讀畢 n就會返回-1
//                    // 在這里首先第一次會把數組填滿 后面第二次循環文件內沒字節了就返回-1
//                    break;
//                }
//                for (int i = 0; i < n; i++) {
//                    System.out.printf("0x%x ", arrB[i]);
//                }
//                System.out.println();
//            }
//        } finally {
//            inputStream.close();
//        }}}}

上述代碼相對于代碼示例1加入了try-finally這樣的代碼,因為如同代碼中注釋所描述的每次你打開一個文件,就會在PCB當中的文件描述符表當中添加一個元素,這個元素當中就是文件的相關信息,文件描述符表類似于一個順序表,它總會有上限當這樣不關閉文件的操作多了,會占滿文件描述符表,此時若是再想打開文件就不行了。因此每次我們使用FileInputStream構造流對象打開文件讀取文件內容等一系列操作之后就要關閉文件,使用try-finally就可以保證每次使用完文件之后能夠關閉文件的流對象,此時文件描述符表中的對應元素就會被釋放。
代碼示例3:

package io;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class Demo6 {public static void main(String[] args) throws IOException {// 使用try finally確實可以 但是作為一個程序員要追求去寫優雅的代碼// 上述代碼修改如下// 直接將流對象的創建放到try右邊的括號中 這樣java會自動幫你調用close()// 注意不是什么對象都可以這樣 必須要實現Closeable接口的類才可以try (InputStream inputStream = new FileInputStream("F:/test.txt");){while (true) {byte[] arrB = new byte[1024];int n = inputStream.read(arrB);System.out.println("n = " + n);if (n == -1) {//讀畢 n就會返回-1// 在這里首先第一次會把數組填滿 后面第二次循環文件內沒字節了就返回-1break;}for (int i = 0; i < n; i++) {System.out.printf("0x%x ", arrB[i]);}System.out.println();}}}}

代碼示例2我們解決了關閉文件流對象釋放文件描述符表中元素的問題,但是使用try-catch好像不夠優雅,于是我們將InputStream流對象構造的這條語句放入try,這樣java會在文件操作完成之后自動給我們的流對象調用close方法,但是要注意的一點就是這種編寫方式的前提是放入try后的括號的對象對應的類必須實現了Closeable接口。
另外在我們使用FileInputStream類對象時可以配合Scanner對象來進行使用,代碼示例如下:

package io;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class  Demo10 {public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("F:/test.txt")) {Scanner sc = new Scanner(inputStream);// 本來這里要在控制臺輸入 但是現在直接將文件中的數據讀走了sc.next();} catch (IOException e) {throw new RuntimeException(e);}}}

以前我們使Scanner對象都是在終端輸入數據,這樣寫代碼就是將我們從終端輸入的數據換成了文件中的數據。另外能這么寫的原因看下圖Scanner類的構造函數的參數就不難理解了,本來就是InputStream類型的,另外我們在之前寫入Scanner對象的System.in也是InputStream類型的。
在這里插入圖片描述

1.2 寫文件

寫文件的流程和讀文件的流程類似的,需要使用OutputStream抽象類以及其子類FileOutputStream。寫文件也要通過FileOutputStream對象的write方法來實現,FileOutputStream對象的write也是要分為三個版本,如下圖。
在這里插入圖片描述
和前面的read參數很類似,第一個版本就是一次在文件中寫入一個字節,寫入的字節由b指定。第二個版本就是一次寫入文件一整個數組,第三個版本也是往文件中寫入一個數組,只是只寫入數組在區間內的部分。
代碼示例如下:

package io;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class Demo7 {public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("F:/test.txt",true)) {// 注意這里打開文件會發現文件內原本的內容被清空 里面全是新添加的內容// 這里的清空操作是打開文件時清空的,即構造對象時清空的// 要是想在文件內追加即append內容 只需在構造對象時將第二個參數設為trueoutputStream.write(97);outputStream.write(98);outputStream.write(98);outputStream.write(99);} catch (IOException e) {throw new RuntimeException(e);}}}

這里寫入文件的代碼需要注意一點就是構造FileOutputStream對象時會直接將對應路徑上的文件內容給清空,如果想要實現寫入文件是一種append的效果,就要在構造流對象時將第二個參數設為true。示例代碼中的注釋也說明了。

二、字符流

使用字符流和字節流操作文件內容基本的流程是類似的,但是字符流讀取和寫入文件內容的基本單位是字符,字節流是字節。

2.1 讀文件

使用字符流讀文件過程和使用字節流讀文件的流程是相似的,只有很少的差別。
代碼示例如下:

package io;import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class Demo8 {public static void main(String[] args) {try (Reader reader = new FileReader("./testDir/test2.txt")) {// 讀入字符的時候要思考一個問題// 文件中的字符編碼集用的是utf8 一個中文字是三個字節// java中的一個中文字是兩個字節// 為什么java中的char還能接收并且打印中文字// 原因:因為在java中的char類型在接收字符時會自動將utf8轉換為unicode編碼集// 實際上java中很多類型在接收數據時都會進行字符集的轉換while (true) {int n = reader.read();if(n==-1) {break;}System.out.printf("%c ",n);}} catch (IOException e) {throw new RuntimeException(e);}}}

如以上的示例代碼,與字節流的FileinputStream不同這里讀文件內容使用的是FileReader類,過程還是類似的,外面套個循環,每次讀取一個字符,直到讀取操作返回值為-1代表文件讀完此時跳出循環。
但是這里會有一個疑問,在windows下文件中的字符是采用utf8的編碼集,在這個編碼集當中單個漢字的字節數是三個,為什么在java中還能使用char類型接收漢字并且打印,char類型在java中只有兩個字節。這個問題的答案就是說java中讀取到文件中內容時會自動轉換編碼集,對于char類型java中使用的時unicode編碼集,讀到的文件中漢字會自動轉為char類型,也就會經過utf8到unicode這個過程,在unicode當中漢字占兩個字節。
在java中不同的類型實際上用的編碼集都是不同的,比如說String類型內部是使用utf8,char類型使用的是unicode。使用String類型變量保存你好就需要6個字節,當使用字符串s.charAt()這種方法將字符賦給char類型變量時,就會將編碼集從utf8轉為unicode,此時一個字就從三個字節轉為了兩個字節。

2.2 寫文件

流程都是類似的,寫文件的操作主要是通過Writer類中的write方法來實現的。
代碼示例如下:

package io;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class Demo9 {public static void main(String[] args) {try (Writer writer = new FileWriter("F:/test.txt")) {// 字符流寫文件和字節流一樣 都是要加上一個true這個參數才能實現append這樣的效果writer.write("你好世界");} catch (IOException e) {throw new RuntimeException(e);}}
}

和字節流的write一樣,要想在寫文件時實現append的效果就需要在構建FileWriter對象時將第二個參數設為true,否則寫文件時都會先清空路徑上的文件內容。

三、文件IO三道例題

(1)掃描指定目錄,并找到名稱中包含指定字符的所有普通文件(包含目錄)。

package io;import java.io.File;
import java.util.Scanner;public class Demo11 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("輸入要查找文件的目錄:");String dirPath = sc.nextLine();System.out.println("輸入要查找文件的關鍵詞:");String keyWord = sc.nextLine();// 根據輸入的路徑構造file對象File dir = new File(dirPath);// 如果輸入的路徑不是目錄則直接返回并報錯if (!dir.isDirectory()) {System.out.println("輸入路徑非法!");return;}// 關鍵詞和目錄都是正確的那么就開始查找文件searchFile(dir, keyWord);}private static void searchFile(File dir, String keyWord) {// 將目錄下的所有文件輸出成數組File[] files = dir.listFiles();// 如果數組為空直接返回 這也是遞歸結束的條件if (files == null) {return;}// 遍歷數組for (File file : files) {// 如果文件是文件 那么判斷是否包含關鍵詞if (file.isFile()) {// 包含則匹配成功if (file.getName().contains(keyWord)) {System.out.println("匹配成功:" + file.getAbsoluteFile());}// 如果是目錄則進行遞歸 在下一級目錄進行查找} else if (file.isDirectory()) {searchFile(file, keyWord);}}}
}

(2)復制文件,輸入一個路徑,表示要被復制的文件,輸入另一個路徑,表示要復制到的目標路徑。

package io;import java.io.*;
import java.util.Scanner;public class Demo12 {public static void main(String[] args) throws IOException {Scanner sc = new Scanner(System.in);System.out.println("輸入要復制的文件路徑:");String srcPath = sc.nextLine();System.out.println("輸入要復制到的文件路徑");String destPath = sc.nextLine();File fileSrc = new File(srcPath);File fileDest = new File(destPath);if (!fileSrc.isFile()) {System.out.println("輸入的要復制的文件路徑不合法!");return;}if (!fileDest.getParentFile().isDirectory()) {System.out.println("輸入的復制到的文件路徑不合法!");return;}byte[] bytes = new byte[1024];// OutPutStream會自動創建文件try (InputStream inputStream = new FileInputStream(fileSrc);OutputStream outputStream = new FileOutputStream(fileDest)) {while (true) {int n = inputStream.read(bytes);if (n == -1) {break;}outputStream.write(bytes, 0, n);}} catch (IOException e) {throw new RuntimeException(e);}}
}

(3)輸入一個路徑再輸入一個查詢詞,搜索這個路徑中文件內容包含這個查詢次的文件。

package io;import java.io.*;
import java.util.Scanner;public class Demo13 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請輸入目標目錄:");String dirPath = sc.nextLine();System.out.println("請輸入要匹配的關鍵詞:");String keyWord = sc.nextLine();File dirFile = new File(dirPath);if (!dirFile.isDirectory()) {System.out.println("輸入路徑不合法!!");return;}search(dirFile, keyWord);}private static void search(File dirFile, String keyWord) {File[] files = dirFile.listFiles();if (files == null) {return;}for (File f :files) {if (f.isFile()) {match(f, keyWord);} else if (f.isDirectory()) {search(f, keyWord);}}}private static void match(File f, String keyWord) {StringBuilder stringBuilder = new StringBuilder();try (Reader reader = new FileReader(f)) {while (true) {int b = reader.read();if (b == -1) {break;}stringBuilder.append((char) b);}} catch (IOException e) {throw new RuntimeException(e);}if (stringBuilder.indexOf(keyWord) >= 0) {System.out.println("匹配成功:" + f.getAbsolutePath());}}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15796.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[AI Google] 介紹 VideoFX,以及 ImageFX 和 MusicFX 的新功能

VideoFX 是來自 labs.google 的最新實驗&#xff0c;您可以查看音樂效果和圖像效果的新更新&#xff0c;現在在 110 多個國家可用。 生成式媒體正在改變人們構思創意并增強我們的創造力能力的方式。我們致力于與創作者和藝術家合作構建人工智能&#xff0c;以更好地理解這些生成…

cmake使用交叉編譯工具鏈并驗證

目錄 一、內容 二、配置 1. 準備cmake文件 2. 使用交叉編譯 三、驗證 1. 構建階段驗證 2. 編譯階段驗證 一、內容 目的&#xff1a;在X86環境下編譯ARM平臺軟件 編寫交叉編譯配置文件&#xff1a;xx.cmake 執行cmake命令時指定&#xff1a;cmake \ -DCMAKE_TOOLCHAIN_F…

Linux Crontab:看完這篇,還有啥不懂的嗎

在Linux系統管理中&#xff0c;自動化是一個至關重要的概念&#xff0c;它可以幫助我們節省時間、減少錯誤并提高效率。crontab> 是實現這一目標的強大工具&#xff0c;它允許我們安排任務在特定的時間自動執行。本文將詳細介紹 crontab 的基礎概念、語法、命令、高級技巧以…

K8S認證|CKA題庫+答案| 12. 查看Pod日志

目錄 12、查看Pod日志 CKA v1.29.0模擬系統免費下載試用&#xff1a; 題目&#xff1a; 開始操作&#xff1a; 1&#xff09;、切換集群 2&#xff09;、提取錯誤日志 3&#xff09;、驗證提取結果 12、查看Pod日志 CKA v1.29.0模擬系統免費下載試用&#xff1a; 百度…

簡單的UDP網絡程序:多人群聊系統

本章重點 能夠實現一個簡單的udp客戶端/服務器; 1.創建套接字 我們把服務器封裝成一個類&#xff0c;當我們定義出一個服務器對象后需要馬上初始化服務器&#xff0c;而初始化服務器需要做的第一件事就是創建套接字。 ?參數說明&#xff1a; domain&#xff1a;創建套接字的域…

Nginx代理配置(專業版)

寫在前面提醒&#xff1a;使用代理&#xff0c;如果可以&#xff0c;請盡量支持雙協議&#xff0c;http、https均要支持哈。 注意&#xff1a;監控系統只是運行代碼&#xff0c;是否支持https&#xff0c;需要運維同學在你們的服務器上配置https證書&#xff0c;配置好證書&…

在 CentOS 上安裝 PostgreSQL 的全面指南

PostgreSQL 是一種功能強大的開源關系型數據庫管理系統&#xff0c;廣泛應用于各種領域。它提供了諸如事務處理、并發控制和數據完整性等高級功能&#xff0c;因此深受開發者和企業的歡迎。本指南將逐步引導您在 CentOS 上安裝 PostgreSQL&#xff0c;以便您充分利用其眾多優勢…

決定了,將ChatGPTer開源!主打一個大模型人人可用。

一個快速上手且極易部署的類ChatGPT開源應用&#xff0c;可接入 OPENAI API 或 通義千問API 開源地址&#xff1a; https://github.com/isnl/EsChat 大聲(偷偷)告訴你&#xff1a;通義千問有免費API額度可白嫖&#xff01;&#xff01;&#xff01; 版本特性 OPENAI 和 通義千…

點云AABB、OBB包圍盒計算顯示

目錄 一、簡介 1)AABB包圍盒 2)OBB包圍盒 二、計算代碼 三、加載計算結果

什么是Promise

Promise 是 JavaScript 中的一個對象&#xff0c;用于處理異步操作。它代表了一個最終可能完成&#xff08;也可能被拒絕&#xff09;的異步操作及其結果值。Promise 對象用于更復雜的異步編程模式&#xff0c;包括使用 .then() 和 .catch() 鏈式調用來處理異步操作的結果。 P…

算法提高之區間最大公約數

算法提高之區間最大公約數 核心思想&#xff1a;線段樹 1.在區間上加一個數 差分 2.求一段區間的最gcd 求[l,r]的gcd 可以拆解為求**[1,l].sum(差分數組 求出來時l點的值)和[l1,r]**做gcd #include <iostream>#include <cstring>#include <algorithm>usi…

1738. 找出第 K 大的異或坐標值

1738. 找出第 K 大的異或坐標值 題目鏈接&#xff1a;1738. 找出第 K 大的異或坐標值 代碼如下&#xff1a; //列前綴異或和 //參考鏈接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/solutions/2790359/liang-chong-fang-fa-er-wei-qian-zhui-yi-68…

Docker數據卷(volume)

數據卷 數據卷是一個虛擬目錄&#xff0c;是容器內目錄與宿主機目錄之間映射的橋梁。&#xff08;容器內目錄與宿主機目錄對應的橋梁&#xff0c;修改宿主機對應的目錄&#xff0c;docker會映射到容器內部&#xff0c;相當于修改了容器內的&#xff0c;反之也一樣&#xff09;數…

利用英特爾 Gaudi 2 和至強 CPU 構建經濟高效的企業級 RAG 應用

檢索增強生成 (Retrieval Augmented Generation&#xff0c;RAG) 可將存儲在外部數據庫中的新鮮領域知識納入大語言模型以增強其文本生成能力。其提供了一種將公司數據與訓練期間語言模型學到的知識分開的方式&#xff0c;有助于我們在性能、準確性及安全隱私之間進行有效折衷。…

任推邦:實力強勁的APP推廣拉新平臺,號稱不扣量

任推邦簡介 任推邦是國內數一數二的項目分發平臺&#xff0c;也是一個不扣量的項目APP推廣拉新平臺&#xff0c;隸屬于聚名科技集團股份有限公司。聚名科技成立時間在2012年&#xff0c;是安徽省老牌互聯網企業&#xff0c;歷經11年的飛速發展&#xff0c;聚名科技成功布局打造…

小程序的這些知識你知道嗎?

一:導航傳參 無論是編程式還是聲明式導骯傳參都是在url?keyvalue&key1value1,無論是否是tabbar頁面. 對于回退頁面,沒辦法傳參. 這個參數是,跳轉到頁面的時候,跳轉到另一個頁面,這個頁面就是剛開始執行,等數據執行之后,觸發onload,傳遞的參數放在內存中,跳轉是內部底層觸…

云端力量:利用移動云服務器高效部署Spring Boot Web應用

文章目錄 一、移動云介紹二、移動云產品選擇三、體驗云主機ECS四、使用移動云服務器部署SpringBoot Web應用4.1移動云ECS安裝JDK4.2移動云ECS安裝MySQL4.3移動云ECS數據庫插入數據4.4移動云ECS部署Spring Boot Web應用 總結 一、移動云介紹 移動云是中國移動基于自研的先進技術…

Linux中常見的基本指令(上)

目錄 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 語法 &#xff1a; ls [ 選項 ][ 目錄或文件 ] 。 功能 &#xff1a;對于目錄…

桶排序和基數排序

前言&#xff1a; 這篇文章&#xff0c;我們就來了解一些鮮為人知的排序&#xff0c;桶排序和基數排序。 桶排序&#xff1a; 桶排序的思想&#xff1a; 桶排序的思想就是把待排序的數盡量均勻地放到各個桶中&#xff0c;再對各個桶進行局部的排序&#xff0c;最后再按序將各…

AI Agent: Agent框架+7個實例

何謂Agent Agent 作為一種新興的人工智能技術&#xff0c;正在受到越來越多的關注。要說清楚什么是 Agent&#xff0c;先得看看人工智能的本質是什么。 人工智能這個名稱來自它試圖通過計算機程序或機器來模擬、擴展和增強人類智能的 一些方面。在這個定義中&#xff0c;“人…