網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
C# 中讀寫(xiě)文件常規(guī)流程
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
//讀
StreamReader sr=new StreamReader(fs);
string line=sr.readLine();
//寫(xiě)
StreamWriter s = new StreamWriter(fs);
s.WriteLine("xxx");
至于修改內(nèi)容 網(wǎng)上大多數(shù)是先把文件所有內(nèi)容讀進(jìn)內(nèi)存,再把內(nèi)容修改后寫(xiě)入文件,這樣對(duì)于小文件沒(méi)有問(wèn)題,但是對(duì)于大文件就不可行了;
操作步驟
- 我們首先寫(xiě)一個(gè)函數(shù)來(lái)讀取一行數(shù)據(jù)
/// <summary>
/// 在文件流當(dāng)前位置開(kāi)始讀取改行的內(nèi)容 返回改行的長(zhǎng)度
/// </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;
}
然后有人會(huì)問(wèn)了,為啥我不用 StreamReader.readLine()來(lái)讀取一行呢?
由于接下來(lái)需要修改當(dāng)前行的內(nèi)容,讀取完當(dāng)前行并確定需要修改的時(shí)候,需要把流的位置移動(dòng)至行首,根據(jù)上面函數(shù)得到讀取的長(zhǎng)度,使用代碼
fs.Seek(-len, SeekOrigin.Current);
如果用len=StreamReader.readLine(),再移動(dòng)指針,你會(huì)發(fā)現(xiàn)流的位置會(huì)在更后面而不是偏移了len,不知道readLine是不是會(huì)預(yù)讀取,導(dǎo)致你覺(jué)得他只讀取了一行,實(shí)際他把流的指針移到后幾行了并且緩存了數(shù)據(jù),再做偏移的時(shí)候 結(jié)果就不對(duì)了 這就是為什么要用上面的方法讀取了;
- 好了,接下來(lái)遍歷讀取文件內(nèi)容
long len=0;
while((len=readRow(fs)!=-1)
{
//......
//修改內(nèi)容
//文件指針移動(dòng)至行首
if(true)
{
fs.Seek(-len, SeekOrigin.Current);
byte[] readWriteByte = Encoding.UTF8.GetBytes("Test");
//會(huì)直接把原來(lái)內(nèi)容替換
fs.Write(readWriteByte, 0, readWriteByte.Length);
//***繼續(xù)往下讀取 直到行尾 把指針移到下一行行首
readRow(fs);
//修改完成直接跳出循環(huán),保存文件
break;
}
}
原文鏈接:https://juejin.cn/post/7113913157524914190
相關(guān)推薦
- 2022-04-30 C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng)_C 語(yǔ)言
- 2022-09-23 opencv實(shí)現(xiàn)車(chē)牌識(shí)別_python
- 2023-01-03 利用C++模擬實(shí)現(xiàn)STL容器:list_C 語(yǔ)言
- 2022-06-29 Python容器類(lèi)型轉(zhuǎn)換的3種方法實(shí)例_python
- 2023-05-26 解讀tf.keras.layers模塊中的函數(shù)_python
- 2023-01-07 基于Go語(yǔ)言實(shí)現(xiàn)選擇排序算法及優(yōu)化_Golang
- 2022-07-09 Python?如何查看程序內(nèi)存占用情況_python
- 2022-10-27 Python?Pandas中布爾索引的用法詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支