網站首頁 編程語言 正文
前言
C# 中讀寫文件常規流程
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
//讀
StreamReader sr=new StreamReader(fs);
string line=sr.readLine();
//寫
StreamWriter s = new StreamWriter(fs);
s.WriteLine("xxx");
至于修改內容 網上大多數是先把文件所有內容讀進內存,再把內容修改后寫入文件,這樣對于小文件沒有問題,但是對于大文件就不可行了;
操作步驟
- 我們首先寫一個函數來讀取一行數據
/// <summary>
/// 在文件流當前位置開始讀取改行的內容 返回改行的長度
/// </summary>
private long readRow(FileStream fs20O)
{
long len = 0;
byte[] b = new byte[1];
bool exit = false;
while (true)
{
if (fs20O.Read(b, 0, 1) == -1) break;
len++;
string str = Encoding.UTF8.GetString(b);
Console.Write(str);
if ("\n".Equals(str))
{
return len;
}
}
return len;
}
然后有人會問了,為啥我不用 StreamReader.readLine()來讀取一行呢?
由于接下來需要修改當前行的內容,讀取完當前行并確定需要修改的時候,需要把流的位置移動至行首,根據上面函數得到讀取的長度,使用代碼
fs.Seek(-len, SeekOrigin.Current);
如果用len=StreamReader.readLine(),再移動指針,你會發現流的位置會在更后面而不是偏移了len,不知道readLine是不是會預讀取,導致你覺得他只讀取了一行,實際他把流的指針移到后幾行了并且緩存了數據,再做偏移的時候 結果就不對了 這就是為什么要用上面的方法讀取了;
- 好了,接下來遍歷讀取文件內容
long len=0;
while((len=readRow(fs)!=-1)
{
//......
//修改內容
//文件指針移動至行首
if(true)
{
fs.Seek(-len, SeekOrigin.Current);
byte[] readWriteByte = Encoding.UTF8.GetBytes("Test");
//會直接把原來內容替換
fs.Write(readWriteByte, 0, readWriteByte.Length);
//***繼續往下讀取 直到行尾 把指針移到下一行行首
readRow(fs);
//修改完成直接跳出循環,保存文件
break;
}
}
原文鏈接:https://juejin.cn/post/7113913157524914190
相關推薦
- 2022-11-10 利用Python的pandas數據處理包將寬表變成窄表_python
- 2023-05-09 Python實現刪除重復文件的示例代碼_python
- 2022-05-20 Python異常之常見的Bug類型解決方法_python
- 2023-03-29 python中文字符如何轉url編碼_python
- 2022-11-03 PyCharm利用pydevd-pycharm實現Python遠程調試的詳細過程_python
- 2022-09-03 .NET使用System.Timers.Timer類實現程序定時執行_實用技巧
- 2022-08-20 如何利用python實現Simhash算法_python
- 2022-11-26 .Net中Task?Parallel?Library的進階用法_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支