C#文件读写操作 [详细]

news/2024/4/24 8:07:43/文章来源:https://blog.csdn.net/m0_65636467/article/details/129116475

C#文件读写操作

    • C# 中的 I/O 类
    • FileStream 类
    • C#中文本文件的读取写入
      • 1) StreamReader
      • 2) StreamWriter
    • 二进制文件读写
      • 1) BinaryReader 类
      • 2) BinaryWriter 类

文件是存储在磁盘中的具有特定名称和目录路径的数据集合,当我们使用程序对文件进行读取或写入时,程序会将文件以数据流(简称流)的形式读入内存中。我们可以将流看作是通过通信路径传递的字节序列,流主要分为输入流和输出流,输入流主要用于从文件读取数据(读操作),输出流主要用于向文件中写入数据(写操作)。

C# 中的 I/O 类

System.IO 命名空间中包含了各种用于文件操作的类,例如文件的创建、删除、读取、写入等等。如下表中所示:

I/O 类描述
BinaryReader从二进制流中读取原始数据
BinaryWriter以二进制格式写入原始数据
BufferedStream临时存储字节流
Directory对目录进行复制、移动、重命名、创建和删除等操作
DirectoryInfo用于对目录执行操作
DriveInfo获取驱动器的信息
File对文件进行操作
FileInfo用于对文件执行操作
FileStream用于文件中任何位置的读写
MemoryStream用于随机访问存储在内存中的数据流
Path对路径信息执行操作
StreamReader用于从字节流中读取字符
StreamWriter用于向一个流中写入字符
StringReader用于从字符串缓冲区读取数据
StringWriter用于向字符串缓冲区写入数据

FileStream 类

FileStream 类在 System.IO 命名空间下,使用它可以读取、写入和关闭文件。创建 FileStream 类对象的语法格式如下所示:

FileStream <object_name> = new FileStream(<file_name>, <FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);

参数说明如下:
object_name:创建的对象名称;

file_name:文件的路径(包含文件名在内);

FileMode:枚举类型,用来设定文件的打开方式,可选值如下:

Append:打开一个已有的文件,并将光标放置在文件的末尾。如果文件不存在,则创建文件;

Create:创建一个新的文件,如果文件已存在,则将旧文件删除,然后创建新文件;

CreateNew:创建一个新的文件,如果文件已存在,则抛出异常;

Open:打开一个已有的文件,如果文件不存在,则抛出异常;

OpenOrCreate:打开一个已有的文件,如果文件不存在,则创建一个新的文件并打开;

Truncate:打开一个已有的文件,然后将文件清空(删除原有内容),如果文件不存在,则抛出异常。

FileAccess:枚举类型,用来设置文件的存取,可选值有 Read、ReadWrite 和 Write;

FileShare:枚举类型,用来设置文件的权限,可选值如下:

Inheritable:允许子进程继承文件句柄,Win32 不直接支持此功能;

None:在文件关闭前拒绝共享当前文件,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败;

Read:允许随后打开文件读取,如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求都将失败,需要注意的是,即使指定了此标志,仍需要附加权限才能够访问该文件;

ReadWrite:允许随后打开文件读取或写入,如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求都将失败,需要注意的是,即使指定了此标志,仍需要附加权限才能够访问该文件;

Write:允许随后打开文件写入,如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求都将失败,需要注意的是,即使指定了此标志,仍可能需要附加权限才能够访问该文件;

Delete:允许随后删除文件。

例如,我们创建一个 FileStream 对象 F 来读取一个名为 sample.txt 的文件,示例代码如下所示:
FileStream F = new FileStream(“sample.txt”, FileMode.Open, FileAccess.Read, FileShare.Read);

FileStream 类中的常用方法如下所示:

方法描述
Close()关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)
CopyTo(Stream)从当前流中读取字节并将其写入到另一流中
Dispose()释放由 Stream 使用的所有资源
Equals(Object)判断指定对象是否等于当前对象
Finalize()确保垃圾回收器回收 FileStream 时释放资源并执行其他清理操作
Flush()清除此流的缓冲区,使得所有缓冲数据都写入到文件中
GetHashCode()默认哈希函数
GetType()获取当前实例的 Type
Lock(Int64, Int64)防止其他进程读取或写入 FileStream
Read(Byte[], Int32, Int32)从流中读取字节块并将该数据写入给定缓冲区中
ReadByte()从文件中读取一个字节,并将读取位置提升一个字节
ToString()返回表示当前对象的字符串
Unlock(Int64, Int64)允许其他进程访问以前锁定的某个文件的全部或部分
Write(Byte[], Int32, Int32)将字节块写入文件流
WriteByte(Byte)将一个字节写入文件流中的当前位置

【示例】使用 FileStream 类读取指定的文件:

using System;
using System.IO;
namespace c.biancheng.net
{class Demo{static void Main(string[] args) {FileStream file = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);for(int i = 0; i < 20; i++){file.WriteByte((byte)i);}file.Position = 0;for(int i = 0; i < 20; i++){Console.Write(file.ReadByte() + " ");}file.Close();Console.ReadKey();}}
}

运行结果:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

C#中文本文件的读取写入

System.IO 命名空间下的 StreamReader 和 StreamWriter 类可以用于文本文件的数据读写。这些类继承自抽象基类 Stream,Stream 类提供了对文件流读写的功能。

1) StreamReader

StreamReader 类继承自抽象基类 TextReader,用来从文件中读取一系列字符,下表列出了 StreamReader 类中一些常用的方法:

方法描述
public override void Close()关闭 StreamReader 对象和基础流,并释放任何与之相关的系统资源
public override int Peek()返回下一个可用的字符,但不使用它
public override int Read()从输入流中读取下一个字符,并把字符位置往前移一个字符

如果想查阅完整的方法列表,可以访问官方API

【示例】使用 StreamReader 读取指定文件的内容,文件的内容如下所示:

薪薪代码
你好
C# 教程

示例代码如下:

using System;
using System.IO;
namespace c.biancheng.net
{class Demo{static void Main(string[] args) {try{// 创建 StreamReader 类的对象StreamReader file = new StreamReader("test.txt");string line;// 从文件中读取内容while((line = file.ReadLine()) != null){Console.WriteLine(line);}}catch(Exception e){// 展示出错信息Console.WriteLine("无法读取文件");Console.WriteLine(e.Message);}Console.ReadKey();}}
}

运行上述代码即可输出文件中的内容。

2) StreamWriter

StreamWriter 类同样继承自抽象类 TextWriter,用来向文件中写入一系列字符,下表列出了 StreamWriter 类中一些常用的方法:

方法描述
public override void Close()关闭当前的 StreamWriter 对象和基础流
public override void Flush()清理当前所有的缓冲区,使所有缓冲数据写入基础流
public virtual void Write(bool value)将布尔值的文本表示形式写入文本流
public override void Write(char value)将一个字符写入流
public virtual void Write(decimal value)将一个小数值的文本表示形式写入文本流
public virtual void Write(double value)将一个 8 字节浮点值的文本表示形式写入文本流
public virtual void Write(int value)将一个 4 字节有符号整数的文本表示形式写入文本流
public override void Write(string value)将一个字符串写入文本流
public virtual void WriteLine()将行结束符写入文本流

完整的方法列表请查阅官方API

【示例】向文件中写入指定内容。

using System;
using System.IO;
namespace c.biancheng.net
{class Demo{static void Main(string[] args) {// 要写入文件中的数据string[] str = new string[]{"薪薪代码","你好","C# 教程"};// 创建 StreamWriter 类的对象StreamWriter file = new StreamWriter("demo.txt");// 将数组中的数据写入文件foreach(string s in str){file.WriteLine(s);}file.Close();// 读取文件中的内容string line = "";StreamReader readfile = new StreamReader("demo.txt");while((line = readfile.ReadLine()) != null){Console.WriteLine(line);}readfile.Close();Console.ReadKey();}}
}

运行结果如下:

薪薪代码
你好
C# 教程

二进制文件读写

C# 中的 BinaryReader 和 BinaryWriter 类可以用于二进制文件的读写。

1) BinaryReader 类

BinaryReader 类用于从文件读取二进制数据,类中的常用方法如下所示:

方法描述
public override void Close()关闭 BinaryReader 对象和基础流
public virtual int Read()从基础流中读取字符,并根据所使用的编码和从流中读取的特定字符,将流的当前位置前移
public virtual bool ReadBoolean()从当前流中读取一个布尔值,并将流的当前位置前移一个字节
public virtual byte ReadByte()从当前流中读取下一个字节,并将流的当前位置前移一个字节
public virtual byte[] ReadBytes(int count)从当前流中读取指定数目的字节到一个字节数组中,并将流的当前位置前移指定数目的字节
public virtual char ReadChar()从当前流中读取下一个字节,并把流的当前位置按照所使用的编码和从流中读取的指定的字符往前移
public virtual char[] ReadChars(int count)从当前流中读取指定数目的字符,并以字符数组的形式返回数据,并把流的当前位置按照所使用的编码和从流中读取的指定的字符往前移
public virtual double ReadDouble()从当前流中读取一个 8 字节浮点值,并把流的当前位置前移八个字节
public virtual int ReadInt32()从当前流中读取一个 4 字节有符号整数,并把流的当前位置前移四个字节
public virtual string ReadString()从当前流中读取一个字符串,字符串以长度作为前缀,同时编码为一个七位的整数

完整的方法列表请查阅 官方API

2) BinaryWriter 类

BinaryWriter 类用于向文件写入二进制数据,类中的常用方法如下表所示:

方法描述
public override void Close()关闭 BinaryWriter 对象和基础流
public virtual void Flush()清理当前编写器的所有缓冲区,使得所有缓冲数据写入基础设备
public virtual long Seek(int offset,SeekOrigin origin)设置当前流中的位置
public virtual void Write(bool value)将一个字节的布尔值写入到当前流中,0 表示 false,1 表示 true
public virtual void Write(byte value)将一个无符号字节写入到当前流中,并把流的位置前移一个字节
public virtual void Write(byte[] buffer)将一个字节数组写入到基础流中
public virtual void Write(char ch)将一个 Unicode 字符写入到当前流中,并把流的当前位置按照所使用的编码和要写入到流中的指定字符往前移
public virtual void Write(char[] chars)将一个字符数组写入到当前流中,并把流的当前位置按照所使用的编码和要写入到流中的指定字符往前移
public virtual void Write(double value)将一个 8 字节浮点值写入到当前流中,并把流位置前移八个字节
public virtual void Write(int value)将一个 4 字节有符号整数写入到当前流中,并把流位置前移四个字节
public virtual void Write(string value)将一个有长度前缀的字符串按 BinaryWriter 的当前编码写如到流中,并把流的当前位置按照所使用的编码和要写入到流中的指定字符往前移

完整的方法列表请查阅官方API

【示例】下面通过示例演示二进制文件的读取和写入:

using System;
using System.IO;
namespace c.biancheng.net
{class Demo{static void Main(string[] args) {BinaryWriter bw;BinaryReader br;int i = 520;double d = 3.14159;bool b = true;string s = "薪薪代码";// 创建文件try{bw = new BinaryWriter(new FileStream("mydata", FileMode.Create));}catch (IOException e){Console.WriteLine(e.Message + "\n 文件创建失败!");return;}// 写入文件try{bw.Write(i);bw.Write(d);bw.Write(b);bw.Write(s);}catch (IOException e){Console.WriteLine(e.Message + "\n 文件写入失败!");}bw.Close();// 读取文件try{br = new BinaryReader(new FileStream("mydata", FileMode.Open));}catch (IOException e){Console.WriteLine(e.Message + "\n 文件打开失败!");return;}try{i = br.ReadInt32();Console.WriteLine("Integer data: {0}", i);d = br.ReadDouble();Console.WriteLine("Double data: {0}", d);b = br.ReadBoolean();Console.WriteLine("Boolean data: {0}", b);s = br.ReadString();Console.WriteLine("String data: {0}", s);}catch (IOException e){Console.WriteLine(e.Message + "\n 文件读取失败!.");}br.Close();Console.ReadKey();}}
}

运行结果:

Integer data: 520
Double data: 3.14159
Boolean data: True
String data:薪薪代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_71738.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞塔Fortinet防火墙SSL VPN双因素身份认证(2FA)方案

作为行业领先的防火墙厂商&#xff0c;飞塔Fortinet结合了高性能 VPN 功能&#xff0c;代表了网络安全的新概念。其中飞塔Fortinet防火墙 SSL VPN 因其突出的安全性能而被广泛应用在远程办公场景中。但在 SSL VPN 登录时用户仅需输入用户名和固定的静态密码&#xff0c;若遭遇账…

kettle安装部署_简单认识_Spoon勺子界面---大数据之kettle工作笔记002

然后我们来看一下这个kettle的安装,很简单,下载解压就可以了 上面的地址是官网很烂 下面的地址好一些 这个是官网可以看到很慢,很不友好 这个是下面那个地址,可以看到 最新的是9.0了,一般都用 一般都用8.2 这里下载这个就可以了 下载以后可以看到有个pdi

LeetCode 每日一题2347. 最好的扑克手牌

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

《爆肝整理》保姆级系列教程python接口自动化(十九)--Json 数据处理---实战(详解)

简介 上一篇说了关于json数据处理&#xff0c;是为了断言方便&#xff0c;这篇就带各位小伙伴实战一下。首先捋一下思路&#xff0c;然后根据思路一步一步的去实现和实战&#xff0c;不要一开始就盲目的动手和无头苍蝇一样到处乱撞&#xff0c;撞得头破血流后而放弃了。不仅什么…

【大数据离线开发】7.2 搭建HBase环境

7.2 搭建HBase的环境 准备工作&#xff1a; 解压Hbase安装包 [rootbigdata111 tools]# tar -zxvf hbase-1.3.1-bin.tar.gz -C ~/training/设置Hadoop的环境变量 vi ~/.bash_profile HBASE_HOME/root/training/hbase-1.3.1 export HBASE_HOMEPATH$HBASE_HOME/bin:$PATH export…

005 利用fidder抓取app的api,获得股票数据

一、下载安装fidder 百度搜索fidder直接下载&#xff0c;按提示安装即可。 二、配置fidder 1. 打开fidder&#xff0c;选择tools——options。 2. 选择HTTPS选项卡&#xff0c;勾选前三项&#xff0c;然后点击右侧【actions】&#xff0c;选择【trust root certificate】&a…

黑马程序员-Linux系统编程-01

课程链接 01-Linux命令基础习惯-Linux系统编程_哔哩哔哩_bilibili 课程重点笔记 01-linux命令基础习惯 终端 终端&#xff1a;一切输入、输出的总称&#xff0c;因此终端并不是一定指的是命令行&#xff0c;只要是能进行输入或者输出即可&#xff0c;但是在linux终端上‘’内…

Java EE|TCP/IP协议栈之传输层UDP协议详解

文章目录一、对UDP协议的感性认识简介主要特点二、UDP的报文结构协议端格式概览报文结构详解源端口目的端口16位UDP报文长度16位校验和参考一、对UDP协议的感性认识 简介 UDP&#xff0c;是User Datagram Protocol的简称&#xff0c;中文名是用户数据报协议&#xff0c;是OSI…

RocketMQ 第二章

RocketMQ 第二章 7、SpringBoot整合RocketMQ SpringBoot 提供了快捷操作 RocketMQ 的 RocketMQTemplate 对象。 7.1、引入依赖 注意依赖的版本需要和 RocketMQ 的版本相同。 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rock…

【Java期末复习】《面向对象程序设计》练习库

目录 一、单选题 二、填空题 三、程序填空题 1、 super使用--有如下父类和子类的定义&#xff0c;根据要求填写代码 2、简单加法计算器的实现 3、House类 4、矩形类 5、创建一个Box类&#xff0c;求其体积 四、函数题 6-1 求圆面积自定义异常类 6-2 判断一个数列是…

会利用信息差赚钱的人才是聪明人

毕业后找不到工作&#xff0c;穷到只剩下时间&#xff0c;大小做了20多份副业兼职&#xff0c;终于找到了可靠的渠道&#xff0c; 我是专科生&#xff0c;学历不好&#xff0c;专业拉胯。毕业后&#xff0c;我找了两三份工作。要么工资太低&#xff0c;只能交房租&#xff0c;…

一种基于强化学习的自动变道机动方法

文章目录摘要前言相关的工作方法论动作空间奖励函数设计Q学习仿真结果结论摘要 变道是一项至关重要的车辆操作&#xff0c;需要与周围车辆协调。建立在基于规则的模型上的自动换道功能可能在预定义的操作条件下表现良好&#xff0c;但在遇到意外情况时可能容易失败。在我们的研…

python元类编程

1.1.propety动态属性 在面向对象编程中&#xff0c;我们一般把名词性的东西映射成属性&#xff0c;动词性的东西映射成方法。在python中他们对应的分别是属性self.xxx和类方法。但有时我们需要的属性需要根据其他属性动态的计算&#xff0c;此时如果直接使用属性方法处理&…

vulnhub zico2

总结&#xff1a;脏牛提权 目录 下载地址 漏洞分析 信息收集 木马上传 反弹shell 提权 下载地址 zico2.ova (Size: 828 MB)Download: https://www.dropbox.com/s/dhidaehguuhyv9a/zico2.ovaDownload (Mirror): https://download.vulnhub.com/zico/zico2.ova使用方法&…

16_FreeRTOS队列集

目录 队列集 队列集相关API函数介绍 队列集使用流程 实验源码 队列集 一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集! 作用:用于对多个队列或信号量进行“监听”其中不管哪一个消息到来&#xff0c;都…

jQuery.NiceScroll - 有史以来最好的 nicescroll 版本——在现代浏览器和移动设备上极其流畅和一致,资源使用率低(中文文档)

jQuery.NiceScroll特征依赖关系使用配置参数有史以来最好的 nicescroll 版本——在现代浏览器和移动设备上极其流畅和一致&#xff0c;资源使用率低 官网:nicescroll.areaaperta.com GitHub:github.com/inuyaksa/jquery.nicescroll CDN引入: https://www.bootcdn.cn/jquery.nic…

上海亚商投顾:沪指放量大涨 券商等权重板块全线飙升

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日集体反弹&#xff0c;沪指、深成指单边拉升&#xff0c;午后均涨超2%&#xff0c;上证50大涨超2.7%&…

[ vulhub漏洞复现篇 ] Drupal 远程代码执行漏洞(CVE-2019-6339)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

java final关键字 详解

概述&#xff1a;作用&#xff1a;细节&#xff1a;演示&#xff1a;总结&#xff1a;一、概述 : final [ˈ faɪnl]&#xff0c;最终的&#xff0c;最后的&#xff0c;决定性的&#xff0c;不可改变的。final作为Java中的一个关键字可以用来修饰类&#xff0c;方法&#xff0c…

Vbs_To_Exe制作简易exe程序

文章目录一、准备vbs脚本文件二、工具打包exe一、准备vbs脚本文件 新建一个文本文档 复制下面代码到文本文档中 Set speech CreateObject("SAPI.SpVoice") speech.Speak "l love you!"修改文本后缀为.vbs。编码选择ANSI&#xff08;解决中文乱码问题&am…