.NET中的流

来源:http://www.cnblogs.com/darrenji/archive/2016/03/08/5252967.html
-Advertisement-
Play Games

當應用程式需要和磁碟上的文件打交道的時候,就有了流的概念。流就像架設在應用程式所在記憶體和磁碟之間的一個管道。 大致思路 → 建立管道 //FileMode.Open打開現有文件,另外還有FileMode.Create, FileMode.Append //FileAccess表示對文件的操作許可權Fi


 

當應用程式需要和磁碟上的文件打交道的時候,就有了流的概念。流就像架設在應用程式所在記憶體和磁碟之間的一個管道。

大致思路


→ 建立管道

 

//FileMode.Open打開現有文件,另外還有FileMode.Create, FileMode.Append
//FileAccess表示對文件的操作許可權FileAccess.Read, FileAccess.Write, FileAccess.ReadWrite
//FileMode和FileAccess搭配使用
Stream pipe = new FileStream(@"C:\temp.png", FileMode.Open, FileAccess.Read);

 

→ 應用程式一般提供一個臨時位元組數組,用來傳遞數據

 

byte[] buffer = new byte[pipe.length];

 

→ 把流中的數據讀到buffer數組中

 

//讀到那裡,從哪個地方開始讀,讀多少
//一般2GB一下的文件採用此方法
//返回讀取到的位元組數,當返回0表示讀到了文件的結尾,流的終點
int bytesRead = pipe.Read(buffer, 0, (int)pipe.Length);

如果此時想把位元組數組buffer顯示出來,按如下:

foreach(var item in buffer)
{
    //顯示成二進位
    Console.Write(item.ToString(item, 2));
}

 

→ 再把buffer中的位元組保存到磁碟文件

 

Stream target = new FileStream(@"C:\target.png", FileMode.Create, FileAccess.Write);
target.Write(buffer, 0, buffer.Length);
target.Dispose();

 

分批覆制


如果文件比較大,那就需要分批覆制了。我們可以根據int bytesRead = pipe.Read(buffer, 0, (int)pipe.Length);中,bytesRead如果大於0就讓迴圈,等於0說明已經讀到源頭流的結尾了。

 

//先定義臨時位元組數組的大小
int BufferSize = 1024;

//源頭流
Stream from = new FileStram(@"C:\bigger.png", FileModel.Open, FileAcess.Read);

//目標流
Stream to  = new FielStream(@"C:\biggertarget.png", FileMode.Create, FileAccess.Write);

byte[] buffer = new byte[BufferSize];
int bytesRead;
do {
    bytesRead = from.Read(buffer, 0, BufferSize);
    to.Write(buffer, 0, BufferSize);
} while (bytesRead > 0)

from.Dispose();
to.Dispose();

 

流的家族成員


以上,瞭解了流的讀取和寫入,現在來瞭解下流的家族成員。

Stream是一個基類,抽象類,基本家族成員包括:

Stream
    FileStream
    MemoryStream
    NetworkStream
    
現實情況是有更多的流,比如加密流、壓縮流等,這些流不僅有Stream的所有特征,還有自己的個性。這時候,用"裝飾器模式"再好不過了。在這裡,"裝飾器模式"體現在:不僅繼承Stream類,還引用Stream類。這些通過"裝飾器模式"來實現的流包括:BufferedStream, DeflateStream, GZipStream, CryptoStream, AuthenticateStream.

流的操作有很多,.NET為我們封裝了StreamReader和StreamWriter來對流進行操作,我們需要把流作為引用傳入。基本用法如下:

 

FileStream from = new FileStream("C:\temp.txt", FileMode.Open, FileAccess.Read);
StreamReader  reader = new StreamReader(from, Encoding.GetEncoding("GB2312"));
...
reader.Dispose();

 

以上,適合於讀取或寫入文本。

當涉及到二進位的讀取和寫入時,.NET為我們封裝了BinaryReader和BinaryWriter。基本用法如下:

 

public class Book
{
    public int Id{get;set;}
    public string Name{get;set;}
    public decimal Price{get;set;}
    
    private string saveFilePath = string.Empty;
    
    public Book(string saveFilePath)
    {
        this.saveFilePath = saveFilePath;
    }
    
    public void SaveBook()
    {
        FileStream fs = new FileStream(this.saveFilePath, FileMode.Create, FileAccess.Write);
        BinaryWriter writer = new BinaryWriter(fs);
        writer.Write(this.Id);
        writer.Write(this.Name);
        writer.Write(this.Price);
        writer.Dispose();
    }
    
    publci void LoadBook()
    {
        FileStream fs = new FileStream(this.saveFilePath, FileMode.Open, FileAccess.Read);
        BinaryReader reader = new BinaryReader(fs);
        this.Id = reader.ReadInt32();
        this.Name = reader.ReadString();
        this.Price = reader.ReadDouble();
        reader.Dispose();
    }
    
    public override string ToString()
    {
        return string.Format("Id:{0}, Name: {1}, Price: {2}", this.Id, this.Name, this.Price);
    }
}

var book = new Book("C:\book.txt"){
    Id = 1,
    Name = "",
    Price = 8
};
book.SaveBook();

 

另外,不僅可以通過諸如new FileStream的構造函數創建流,.NET還為我們提供了產生流的靜態幫助類和靜態方法,比如File和FileInfo等,用法大致是:
FileStream fs = File.Create("C:\temp.jpg");

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近好久沒有更新文章了,因為好久沒有寫代碼了,以至於我不知道同大家分享些什麼,剛好,今天突然叫我學習下jenkins每日構建,我就把今天的學習筆記記錄下來,這其中很多東西都是公司同事之前調研總結的,我在他的基礎上進行了更加詳細的整理,並自己一步一步的對著實現了一下。 環境準備 下載jenkins的w
  • 由於在官方下載的ueditor包是在vs2012下開發的,可以在vs2010中使用,但在vs2008中就會報錯。折騰了一翻,現將解決方法分享給需要的朋友,其實就是把裡面包含.net4.0的元素換成.net3.5的 1、下載.net framework 3.5版的Newtonsoft.Json.dll
  • 原來用的是Kindeditor這個編輯器,但很久沒更新了,最新版是13年更新的。現在要換成百度的Ueditor, 在這裡記錄Ueditor的使用流程和遇到的問題。 一、下載 1.Ueditor官網 這裡有三個版本:1.UBuilder:可以自定義選擇自已需要的功能,然後會下載對應的文件。 2.開發版
  • 那天在調試API的時候,發現用c#寫的SHA1加密出來的結果和PHP中sha1()出來的不一樣,找了半天的原因後來才弄出來 在調試微信介面的時候大多的幫助文檔都是提供的是PHP的方法,所以在.net中實現的時候會出現很多的問題,最典型的就是token通不過驗證 現在提供一個結果與Php一樣 的SHA
  • 本次將考察三類工具,它們是每一位 MVC 程式員工具庫的成員:DI容器、單元測試框架和模仿工具。 1.創建一個示例項目 創建一個空 ASP.NET MVC 4 項目 EssentiaTools 。 1.1 創建模型類 在 Models 文件夾下新建 Product.cs 類文件 using Syst
  • 最強大腦有個小孩玩俄羅斯方塊游戲神乎其技,那麼,就寫一個吧,玩玩而已。 由於邏輯簡單,又作了一些簡化,所以代碼並不多。 using System; using System.Collections.Generic; using System.Linq; using System.Windows; u
  • 回到目錄 在MVC里,你的控制器對應的視圖一般是在Views目錄,而如果希望在Views里再分幾個模塊文件夾預設是不允許的,我們需要做一下設置,就可以實現Views下的多次文件夾層次了,例如,我們有產品模塊,用戶模塊,訂單模塊,我們就可以把它的文件夾結構設計成如下 用戶模塊:/views/UserM
  • ------解決方案--------------------------------------------------------1.看下你的輸出是不是包含在<ajax:AjaxPanel ID="AjaxPanel1" runat="server" ></ajax:AjaxPanel>標簽裡面;
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...