【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流

文章目錄

  • 【.NET Core】深入理解IO - FileSteam流
    • 一、IO流概述
    • 二、文件流FileStream
      • 2.1 FileStream概述
      • 2.2 FileStream檢測流位置更改
      • 2.3 FileStream構造函數
      • 2.4 FileStream常用屬性
      • 2.5 FileStream.Read方法
      • 2.6 FileStream.Write方法
      • 2.7 FileStream.Seek方法
      • 2.8 FileStream.Flush 方法
    • 三、FileStream總結

在這里插入圖片描述

一、IO流概述

抽象類Stream支持讀取和寫入字節。所有表示流的類都繼承自Stream類。Stream類及其派生類提供數據源和存儲庫的常見視圖。

流主要設計三個基本的操作:

  • 讀取 - 將數據從流傳輸到數據結構中。
  • 寫入 - 將數據從數據源傳輸到流。
  • 查找 - 對流中的當前位置進行查詢和修改。

IO流常用的流包含一下幾個類,博主將在將來的博文中一一介紹。

  • FileStream - 用于對文件進行讀取和寫入操作。
  • IsolatedStorageFileStream - 用于對獨立存儲中的文件進行讀取或寫入操作。
  • MemoryStream - 用于作為后備存儲對內存進行讀取和寫入操作。
  • BufferedStream - 用于改進讀取和寫入操作的性能。
  • NetworkStream - 用于通過網絡套接字進行讀取和寫入。
  • PipStream - 用于通過匿名和命名管道進行讀取和寫入。
  • CryptoStream - 用于將數據流鏈接到加密轉換。

二、文件流FileStream

2.1 FileStream概述

使用FileStream類讀取、寫入、打開和關閉文件系統上的文件,以及操作其他與文件相關的操作句柄、包括管道、標注輸入和標注輸出。可以使用Write和方法執行同步操作,或者ReadAsyncCopyToAsyncWriteAsync以及FlushAsync執行異步操作的方法。FlushReadCopyTo使用異步方法執行資源密集型文件操作,而不阻止主線程。

FileStream類實現IDisposable接口。在使用完類型后,你應直接或間接釋放類型。如要直接釋放類型,請在try/catch塊中調用其Dispose方法。如要間接釋放類型,請使用using語言構造。

2.2 FileStream檢測流位置更改

FileStream當對象在其句柄上沒有獨占保留時,另一個線程可以同時訪問文件句柄,并更改與文件句柄關聯的操作系統文件指針的位置。在這種情況下,對象中的FileStream緩存位置以及緩沖區中緩存的數據可能會受到損害。該FileStream對象定期對訪問緩存緩沖區的方法執行檢查,以確保操作系統的句柄位置與對象使用的FileStream緩存位置相同。

2.3 FileStream構造函數

  • FileStream(String,FileMode)

使用指定的路徑和創建模式初始化FileStream類的新實例。

  • FileStream(String,FileStreamOptions)

使用指定的路徑、創建模式、讀/寫和共享權限、緩存區大小、其他文件選項、預分配大小及其FileStream對同一文件的訪問權限初始化類的新實例FileSteam

  • FileStream(String,FileMode,FileAccess)

使用指定的路徑、創建模式和讀/寫權限初始化FileStream類新實例。

  • FileStream(String,FileMode,FileAccess,FileShare,Int32,Boolean)

使用指定的路徑、創建模式、讀/寫和共享權限、緩沖區大小和同步或異步狀態初始化FileStream類的新實例。

  • FileStream(String,FileMode,FileAccess,FileShare)

使用指定的路徑、創建模式、讀/寫權限和共享權限創建 FileStream類的新實例

  • FileStream(String,FileModel,FileAccesss,FileShare,Int32,FileOptions)

使用指定的路徑、創建模式、讀/寫和共享權限、其他 FileStreams 可以具有的對此文件的訪問權限、緩沖區大小和附加文件選項初始化FileStream類的新實例。

2.4 FileStream常用屬性

序號屬性名屬性說明
1CanRead獲取一個值,該值指示當前流是否支持讀取
2CanSeek獲取一個值,該值指示當前流是否支持查詢
3CanTimeout獲取一個值,該值確定當前流是否可以超時
4CanWrite獲取一個值,該值指示當前流是否支持寫入
5IsAsync獲取一個值,它指示FileStream是異步打開還是同步打開的
6Length獲取流的長度(以字節為單位)
7Name獲取FileStream中已打開的文件的絕對路徑
8Position獲取或設置此流的當前位置
9ReadTimeout獲取或設置一個值(以毫秒為單位),該值確定流在超時前將嘗試讀取的時間
10SafeFileHandle獲取 SafeFileHandle對象,它代表當前FileStream對象所封裝的文件的操作系統文件句柄。
11WriteTimeout獲取或設置一個值(以毫秒為單位),該值確定在超時前將嘗試寫入多長時間。

2.5 FileStream.Read方法

從流中讀取字節塊并將該數據寫入給定緩沖區中

  • 重載
序號方法說明
1Read(Byte[],Int32,Int32)從流中讀取字節塊并將該數據寫入給定緩沖區中
2Read(Span)從當前文件流中讀取字節序列,并在該文件流中按照讀取的字節數提升位置。
  • 注解

方法Read 中offset參數(開始讀取的緩沖區索引)提供字節array的偏移量,參數count提供要從此流中讀取的最大字節數。返回的值是讀取的實際字節數。如果到達流的末尾,則返回的值為零。如果讀取操作成功,則流的當前位置將按讀取的字節數前進。如果發生異常,流的當前位置保持不變。

方法Read僅在到達流的末尾后返回零,否則,Read始終在返回之前至少從流中讀取一個字節。如果在調用Read時流中沒有數據可用,則方法將阻塞,直到至少可以返回一個字節的數據。實現可以自由返回比請求的字節少,即使尚未到達流的末尾。

  • 示例
public void FileReadDemo()
{string pathSource = @"c:\tests\source.txt";try{using (FileStream fsSource = new FileStream(pathSource,FileMode.Open,FileAccess.Read)){byte[] bytes = new byte[fsSource.Length];int numBytesToRead = (int)fsSource.Length;int numBytesRead = 0;while (numBytesToRead > 0){int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);if (n == 0)break;numBytesRead += n;numBytesToRead -= n;}numBytesToRead = bytes.Length;using (FileStream fsNew = new FileStream(pathNew,FileMode.Create, FileAccess.Write)){fsNew.Write(bytes, 0, numBytesToRead);}}}catch(FileNotFoundException fileStreamException){Console.WriteLine(fileStreamException.Message)    }
}

2.6 FileStream.Write方法

將字節的序列從只讀范圍寫入當前文件流,并按寫入的字節數向前移動此文件流中的當前位置。

  • 重載
序號方法說明
1Write(ReadOnlySpan)將字節的序列從只讀范圍寫入當前文件流,并按寫入的字節數向前移動此文件流中的當前位置
2Write(Byte[],Int32,Int32)將字節塊寫入文件流。
  • 注解

CanWrite使用,屬性確定當前實例是否支持寫入。WriteAsync使用方法以異步方式寫入當前流。

如果吸入操作成功,則文件流中的位置將按寫入的字節數前進。如果發生異常,則文件流中的位置保持不變。

  • 示例
if(fileStream.Length == 0)
{tempString =lastRecordText + recordNumber.ToString();fileStream.Write(uniEncoding.GetBytes(tempString),0,uniEncoding.GetByteCount(tempString));
}

2.7 FileStream.Seek方法

將該流的當前位置設置為給定值。

public override long Seek (long offset, System.IO.SeekOrigin origin);
  • offset 相對于origin的點,從此處開始查找。
  • SeekOrigin 使用SeekOrigin 類型的值,將開始位置,結束位置或當前位置指定為offset的參考點。
  • 示例
public static void Main()
{long offset;int nextByte;using (FileStream fs = new FileStream(@"c:\temp\alphabet.txt", FileMode.Open, FileAccess.Read)){for (offset = 1; offset <= fs.Length; offset++){fs.Seek(-offset, SeekOrigin.End);Console.Write((char)fs.ReadByte());}Console.WriteLine();fs.Seek(20, SeekOrigin.Begin);while ((nextByte = fs.ReadByte()) > 0){Console.Write((char)nextByte);}Console.WriteLine();}
}

2.8 FileStream.Flush 方法

調用FileStream.Flush方法時,會刷新操作系統I/O緩沖區。

I/O緩沖區只有調用Flush或釋放對象才會釋放緩沖區,否則不會刷新流的編碼器。如將StreamWriter.AutoFlushtrue表示數據將從緩沖區刷新到流,但不會刷新編碼器狀態。這允許編碼器將其狀態保留,以便可以正確編碼一下字符塊。

三、FileStream總結

上面介紹了FileStream的一般用法,如果需要有異常操作,異步讀取使用ReadAsync方法,使用ReadAsync方法 可以執行資源密集型文件操作,而不會阻止main線程。 異步寫入使用WriteAsync方法,WriteAsync方法可以執行資源密集型文件操作,而不會阻止main線程。在選擇FileStream時,根據實際的使用場景選擇對應的方法完成對流的操作。

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

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

相關文章

插混、油混、增程式、輕混、強混,啥區別

這里寫自定義目錄標題 隨著我國新能源汽車的大力推進&#xff0c;電車可以說是世界未來的主流&#xff0c;只不過現在是處在一個過渡時代 這是個好時代&#xff0c;因為我們見證并體驗著歷史過渡的細節 這是個不好的時代&#xff0c;因為我們可能只是未來新新人類的試驗品 幫他…

MyBatis 學習(三)之 MyBatis 全局配置文件

目錄 1 MyBatis 全局配置文件 2 properties 元素 3 setting 設置 4 typeAlianses 別名處理器 5 typeHandler 類型處理器 6 objectFacotry 對象工廠&#xff08;了解&#xff09; 7 plugins 插件&#xff08;了解&#xff09; 8 environments 運行環境 9 databaseIdPro…

今日arXiv最熱大模型論文:點擊即可播放!港中文發布大模型寫歌神器!

一首歌&#xff0c;包含作詞作曲兩個部分。擅長作詞or作曲就已經很牛了。比如方文山是周杰倫的御用作詞人&#xff0c;而周杰倫寫過很多耳熟能詳的曲子。而兼具作詞作曲才華的全能創作人卻是難得一見。 最近港中文發布了一款歌曲創作大模型SongComposer&#xff0c;作詞作曲都…

自測-1 打印沙漏

文章預覽&#xff1a; 題目算法代碼 題目 算法 以前做過這個&#xff0c;那次是c語言寫的&#xff0c;一點一點處理一層一層完成&#xff0c;這次我換了一種語言用了另一種思想使用遞歸去寫&#xff0c;還是我們要先求出應該有多少層這個很容易&#xff0c;中間輸出部分我們算…

常見查找算法Java實現

順序&#xff08;線性&#xff09;查找二分查找/折半查找插值查找斐波那契查找 線性查找 判斷數列是否包含要求&#xff0c;如果找到了&#xff0c;就提示找到了&#xff0c;并給出下標值 // 線性查找 public static ArrayList<Integer> seqSearch(int[] arr, int value…

解決 npm install 報錯的問題

在使用 npm 安裝依賴包時&#xff0c;有時候會遇到各種報錯問題&#xff0c;以下是一些常見的報錯及解決方法&#xff1a; 1. ENOENT: no such file or directory 如果出現類似 ENOENT: no such file or directory 的報錯&#xff0c;可能是因為某些文件或目錄缺失或路徑錯誤…

動態規劃課堂3-----簡單多狀態問題(買賣股票最佳時機)

目錄 引入&#xff1a; 例題1&#xff1a;按摩師&#xff08;打家劫舍I&#xff09; 例題2&#xff1a;打家劫舍II 例題3&#xff1a;刪除并獲得點數 例題4&#xff1a;粉刷房子 例題5&#xff1a;買賣股票的最佳時機含冷凍 結語&#xff1a; 引入&#xff1a; 相信看到…

深度學習 精選筆記(8)梯度消失和梯度爆炸

學習參考&#xff1a; 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增)&#xff0c;以達到集多方教程的精華于一文的目的。 ③非常推薦上面&#xff08;學習參考&#x…

帶你快速初步了解Python列表

1.列表 列表主要是用來存儲多個數據&#xff0c;是有序的集合 2.創建列表 """ 語法&#xff1a;變量名 [數據1,數據2,數據3......] 注意&#xff1a;列表中的數據類型可以是各種不同的數據類型 """ 創建空列表 list1 [] print(list1) …

Gitlab: 私有化部署

目錄 1. 說明 2. 資源要求 3. 安裝 4. 配置實踐 4.1 服務器 4.2 人員與項目 4.2 部署準備 4.2.1 訪問變量及用戶賬號設置 4.2.2 Runner設置 4.2.3 要點 5. 應用項目 CI/CD 6. 參考 1. 說明 gitlab是一個強大且免費的代碼管理/部署工具&#xff0c;能統一集成代碼倉…

AngularJS入門

1. AngularJS簡介 AngularJS是一個JavaScript框架,用js編寫的庫 <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> <!-- 放在<body> 元素的底部。提高網頁加載速度 -->1.1. AngularJS 擴展了 HTML …

Freesia項目目錄結構

目錄結構 前端目錄&#xff1a; &#xff08;目錄結構來自layui-vue-admin&#xff09; src文件下 api&#xff08;前端請求后端服務的路由&#xff09;assert&#xff08;一些內置或必要的資源文件&#xff09;layouts&#xff08;全局框架樣式組件&#xff09;router&…

Unity(第十九部)射線

在Unity中&#xff0c;射線檢測通常用于碰撞檢測&#xff0c;比如&#xff1a;在游戲中&#xff0c;開槍射擊時&#xff0c;需要判斷擊中的物體、子彈擊中的位置&#xff1b;用鼠標來控制物體的移動&#xff1b;用鼠標拾取某個物體。 射線&#xff0c;顧名思義&#xff0c;在數…

【轉載】深度學習筆記——詳解損失函數

原文鏈接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN賬號: Purepisces github賬號: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 損失函數 根據您使用的神經網絡類型和數…

第四十七回 一丈青單捉王矮虎 宋公明二打祝家莊-強大而靈活的python裝飾器

四面全是埋伏&#xff0c;宋江和眾人一直繞圈跑不出去。正在慌亂之時&#xff0c;石秀及時趕到&#xff0c;教大家碰到白楊樹就轉彎走。走了一段時間&#xff0c;發現圍的人越來越多&#xff0c;原來祝家莊以燈籠指揮號令。花榮一箭射下來紅燈龍&#xff0c;伏兵自己就亂起來了…

Northwestern University-844計算機科學與技術/軟件工程-復試注意事項【考研復習】

本文提到的西北大學是位于密歇根湖泊畔的西北大學。西北大學&#xff08;英語&#xff1a;Northwestern University&#xff0c;簡稱&#xff1a;NU&#xff09;是美國的一所著名私立研究型大學。它由九人于1851年創立&#xff0c;目標是建立一所為西北領地地區的人服務的大學。…

【力扣白嫖日記】550.游戲玩法分析IV

前言 練習sql語句&#xff0c;所有題目來自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免費數據庫練習題。 今日題目&#xff1a; 550.游戲玩法分析IV 表&#xff1a;Activity 列名類型player_idintdevice_idintevent_datedategames_played…

從 iOS 設備恢復數據的 20 個iOS 數據恢復工具

作為 iPhone、iPad 或 iPod 用戶&#xff0c;您可能普遍擔心自己可能會丟失存儲在珍貴 iOS 設備中的所有寶貴數據。數據丟失的原因多種多樣&#xff0c;這里列出了一些常見原因&#xff1a; 1. iOS 軟件更新 2. 恢復出廠設置 3. 越獄 4. 誤操作刪除數據 5. iOS 設備崩潰 …

C++筆記(五)--- 虛函數(virtual)

目錄 虛函數介紹 虛函數、覆蓋和重載區別 虛函數介紹 C的虛函數是多態性的表現 1.構造函數不能為虛函數2.子類繼承時虛函數仍為虛函數3.虛函數類外實現時&#xff0c;不需要加virtual4.有虛函數的類&#xff0c;析構函數一定要寫成虛函數&#xff08;否則可能會造成內存泄漏&…

【代碼隨想錄python筆記整理】第十六課 · 出現頻率最高的字母

前言:本筆記僅僅只是對內容的整理和自行消化,并不是完整內容,如有侵權,聯系立刪。 一、哈希表初步 在之前的學習中,我們使用數組、字符串、鏈表等等,假如需要找到某個節點,則都要從頭開始,逐一比較,直到找到為止。為了能夠直接通過要查找的記錄找到其存儲位置,我們選…