精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AsyncRead和AsyncWrite 模塊進階用法示例

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-20 11:41 ? 次閱讀

Rust 語言是一門高性能、安全、并發的編程語言,越來越受到開發者的關注和喜愛。而 Tokio 是 Rust 語言中一個非常流行的異步運行時,它提供了一系列的異步 I/O 操作,其中包括 AsyncRead 和 AsyncWrite 模塊。這兩個模塊是非常重要的,它們可以讓我們在異步編程中更加方便地讀寫數據。本教程將圍繞這兩個模塊,提供基礎和進階用法的示例,幫助讀者更好地理解和使用它們。

基礎用法

從文件中讀取數據

use tokio::fs::File;
use tokio::io::{self, AsyncReadExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut file = File::open("test.txt").await?;
    let mut buffer = [0; 10];
    let n = file.read(&mut buffer).await?;
    println!("The bytes read: {:?}", &buffer[..n]);
    Ok(())
}

這個示例演示了如何使用 AsyncRead 模塊從文件中讀取數據。首先,我們使用File::open函數打開文件,然后使用read方法從文件中讀取數據。在這個示例中,我們讀取了 10 個字節的數據,并將其存儲在一個長度為 10 的緩沖區中。最后,我們打印出讀取的字節。

從 TCP 連接中讀取數據

use tokio::net::TcpStream;
use tokio::io::{self, AsyncReadExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut stream = TcpStream::connect("127.0.0.1:8080").await?;
    let mut buffer = [0; 10];
    let n = stream.read(&mut buffer).await?;
    println!("The bytes read: {:?}", &buffer[..n]);
    Ok(())
}

這個示例演示了如何使用 AsyncRead 模塊從 TCP 連接中讀取數據。首先,我們使用TcpStream::connect函數連接到一個 TCP 服務器,然后使用read方法從連接中讀取數據。在這個示例中,我們讀取了 10 個字節的數據,并將其存儲在一個長度為 10 的緩沖區中。最后,我們打印出讀取的字節。

向文件中寫入數據

use tokio::fs::File;
use tokio::io::{self, AsyncWriteExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut file = File::create("test.txt").await?;
    let buffer = b"Hello, world!";
    file.write_all(buffer).await?;
    Ok(())
}

這個示例演示了如何使用 AsyncWrite 模塊向文件中寫入數據。首先,我們使用File::create函數創建一個新的文件,然后使用write_all方法將數據寫入文件中。在這個示例中,我們向文件中寫入了一個字符串"Hello, world!"。

向 TCP 連接中寫入數據

use tokio::net::TcpStream;
use tokio::io::{self, AsyncWriteExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut stream = TcpStream::connect("127.0.0.1:8080").await?;
    let buffer = b"Hello, world!";
    stream.write_all(buffer).await?;
    Ok(())
}

這個示例演示了如何使用 AsyncWrite 模塊向 TCP 連接中寫入數據。首先,我們使用TcpStream::connect函數連接到一個 TCP 服務器,然后使用write_all方法將數據寫入連接中。在這個示例中,我們向連接中寫入了一個字符串"Hello, world!"。

讀取文件中的全部數據

use tokio::fs::File;
use tokio::io::{self, AsyncReadExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut file = File::open("test.txt").await?;
    let mut buffer = Vec::new();
    file.read_to_end(&mut buffer).await?;
    println!("The bytes read: {:?}", buffer);
    Ok(())
}

這個示例演示了如何使用 AsyncRead 模塊讀取文件中的全部數據。首先,我們使用File::open函數打開文件,然后使用read_to_end方法讀取文件中的全部數據。在這個示例中,我們將讀取到的數據存儲在一個動態數組中,并打印出讀取的字節。

復制文件

use tokio::fs::{self, File};
use tokio::io::{self, AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut source_file = File::open("source.txt").await?;
    let mut dest_file = File::create("dest.txt").await?;
    let mut buffer = [0; 1024];
    loop {
        let n = source_file.read(&mut buffer).await?;
        if n == 0 {
            break;
        }
        dest_file.write_all(&buffer[..n]).await?;
    }
    Ok(())
}

這個示例演示了如何使用 AsyncRead 和 AsyncWrite 模塊復制文件。首先,我們使用File::open函數打開源文件,使用File::create函數創建目標文件。然后,我們使用一個循環,每次讀取 1024 字節的數據,并將其寫入目標文件中,直到源文件讀取完畢。在這個示例中,我們使用了readwrite_all方法。

使用 BufReader 和 BufWriter

use tokio::fs::File;
use tokio::io::{self, AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut file = File::open("test.txt").await?;
    let mut reader = BufReader::new(file);
    let mut writer = BufWriter::new(io::stdout());
    let mut line = String::new();
    loop {
        let n = reader.read_line(&mut line).await?;
        if n == 0 {
            break;
        }
        writer.write_all(line.as_bytes()).await?;
        line.clear();
    }
    Ok(())
}

這個示例演示了如何使用 BufReader 和 BufWriter 來進行異步讀寫。首先,我們使用File::open函數打開文件,然后使用BufReader::new函數將文件包裝成一個緩沖讀取器,使用BufWriter::new函數將標準輸出包裝成一個緩沖寫入器。然后,我們使用一個循環,每次讀取一行數據,并將其寫入標準輸出中。在這個示例中,我們使用了read_linewrite_all方法。

使用 split 和 join

use tokio::fs::File;
use tokio::io::{self, AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut file = File::open("test.txt").await?;
    let mut buffer = Vec::new();
    file.read_to_end(&mut buffer).await?;
    let mut parts = buffer.split(|&b| b == b'n');
    let mut tasks = Vec::new();
    while let Some(part) = parts.next() {
        let task = tokio::spawn(async move {
            let mut file = File::create("output.txt").await?;
            file.write_all(part).await?;
            Ok(())
        });
        tasks.push(task);
    }
    for task in tasks {
        task.await?;
    }
    Ok(())
}

這個示例演示了如何使用 split 和 join 來進行異步讀寫。首先,我們使用File::open函數打開文件,然后使用read_to_end方法讀取文件中的全部數據,并將其存儲在一個動態數組中。然后,我們使用split方法將數據按照換行符分割成多個部分。接著,我們使用一個循環,每次將一個部分異步地寫入一個新的文件中,并使用tokio::spawn函數創建一個異步任務。最后,我們使用join函數等待所有的異步任務完成。在這個示例中,我們使用了write_all方法。

使用 timeout

use tokio::net::TcpStream;
use tokio::io::{self, AsyncReadExt};

#[tokio::main]
async fn main() - > io::Result< () > {
    let mut stream = TcpStream::connect("127.0.0.1:8080").await?;
    let mut buffer = [0; 10];
    let n = tokio::time::timeout(std::time::Duration::from_secs(5), stream.read(&mut buffer)).await??;
    println!("The bytes read: {:?}", &buffer[..n]);
    Ok(())
}

這個示例演示了如何使用 timeout 來設置異步讀取的超時時間。首先,我們使用TcpStream::connect函數連接到一個 TCP 服務器,然后使用read方法從連接中讀取數據。在這個示例中,我們使用了timeout函數來設置讀取的超時時間為 5 秒。如果在 5 秒內沒有讀取到數據,將返回一個錯誤。在這個示例中,我們使用了time::timeout函數。

總結

本教程圍繞 Tokio 模塊的 AsyncRead 和 AsyncWrite 模塊,提供了基礎和進階用法的示例。通過學習這些示例,讀者可以更好地理解和使用這兩個模塊,從而更加方便地進行異步讀寫操作。當然,這些示例只是冰山一角,讀者可以通過進一步的學習和實踐,掌握更多的異步編程技巧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2670

    瀏覽量

    47340
  • 編程語言
    +關注

    關注

    10

    文章

    1938

    瀏覽量

    34593
  • Rust
    +關注

    關注

    1

    文章

    228

    瀏覽量

    6570
收藏 人收藏

    評論

    相關推薦

    SQLx的基礎用法進階用法

    SQLx是一個Rust語言的異步SQL數據庫訪問庫,支持多種數據庫,包括PostgreSQL、MySQL、SQLite等。本教程將以SQLite為例,介紹SQLx的基礎用法進階用法。 基礎
    的頭像 發表于 09-19 14:29 ?2236次閱讀

    Stream模塊的基礎用法進階用法

    有用。在本教程中,我們將介紹 Stream 模塊的基礎用法進階用法,并提供示例。 基礎用法
    的頭像 發表于 09-19 15:33 ?1150次閱讀

    基于Rust語言Hash特征的基礎用法進階用法

    ,包括Hash trait、HashMap、HashSet等,本教程將詳細介紹Rust語言Hash特征的基礎用法進階用法。 基礎用法 使用Hash trait 在Rust語言中,Ha
    的頭像 發表于 09-19 16:02 ?1382次閱讀

    erode函數用法示例

    《OpenCV3編程入門》書本配套源代碼erode函數用法示例
    發表于 06-06 15:09 ?1次下載

    bilateralFilter函數用法示例

    《OpenCV3編程入門》書本配套源代碼bilateralFilter函數用法示例
    發表于 06-06 15:20 ?6次下載

    HoughLines函數用法示例

    《OpenCV3編程入門》書本配套源代碼:HoughLines函數用法示例
    發表于 06-06 15:20 ?3次下載

    MedianBlur函數用法示例

    《OpenCV3編程入門》書本配套源代碼:MedianBlur函數用法示例
    發表于 06-06 15:20 ?14次下載

    GaussianBlur函數用法示例

    《OpenCV3編程入門》書本配套源代碼:GaussianBlur函數用法示例
    發表于 06-06 15:20 ?5次下載

    remap函數用法示例

    《OpenCV3編程入門》書本配套源代碼:remap函數用法示例
    發表于 06-06 15:20 ?2次下載

    sobel函數用法示例

    《OpenCV3編程入門》書本配套源代碼:sobel函數用法示例
    發表于 06-06 15:20 ?2次下載

    pyrUp函數用法示例

    《OpenCV3編程入門》書本配套源代碼:pyrUp函數用法示例
    發表于 06-06 15:20 ?1次下載

    pyrDown函數用法示例

    《OpenCV3編程入門》書本配套源代碼:pyrDown函數用法示例
    發表于 06-06 15:20 ?16次下載

    Scharr函數用法示例

    《OpenCV3編程入門》書本配套源代碼:Scharr函數用法示例
    發表于 06-06 15:20 ?14次下載

    基于select!宏的進階用法

    宏,它可以讓我們同時監聽多個異步事件,一旦其中一個事件觸發,就可以立即執行相應的代碼。在本教程中,我們將詳細介紹 select!宏的進階用法,并提供多個示例來幫助您更好地理解和掌握這個宏的使用方法。
    的頭像 發表于 09-19 15:35 ?600次閱讀

    元組的基礎用法進階用法

    元組是 Rust 語言中一種非常有用的數據結構,它可以將多個不同類型的值組合在一起。本教程將介紹元組的基礎用法進階用法,并結合示例代碼進行講解。 元組是一種有序的數據集合,其中每個元
    的頭像 發表于 09-30 16:49 ?847次閱讀