一、流简介

在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。
    计算机中的流其实是一种信息的转换。

它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外 输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。
    对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。
    所以, 可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。
    流所在的命名空间也是System.IO,主要包括文本文件的读写、图像和声音文件的读写、二进制文件的读写等。
    在 System.IO 命名空间中提供了多种类,用于进行文件和数据流的读写操作。
    要使用这些类,需要在程序的开头包含语句:using System.IO。
    流是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信管道等。
    流提供一种向后备存储器写入字节和从后备存储器读取字节的方式。
    除了和磁盘文件直接相关的文件流以外,流还有多种类型。
    例如数据流 (Stream) 是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象。
    数据有来源和目的地,衔接两者的就是串流对象。用比喻的方式来说或,数据就好比水,串流对象就好比水管,通过水管的衔接,水由一端流向另一端。
    从应用程序的角度来说,如果将数据从来源取出,可以试用输入 ( 读 ) 串流,把数据储存在内存缓冲区;如果将数据写入目的地,可以使用输出 ( 写 ) 串流,把内存缓冲区的数据写入目的地。
    当希望通过网络传输数据,或者对文件数据进行操作时,首先需要将数据转化为数据流。
    典型的数据流和某个外部数据源相关,数据源可以是文件、外部设备、内存、网络套接字等。
    根据数据源的不同,.Net 提供了多个从 Stream 类派生的子类,每个类代表一种具体的数据流类型,比如磁盘文件直接相关的文件流类 FileStream,和套接字相关的网络流类 NetworkStream,和内存相关的内存流类 MemoryStream 等。

(总之,就是对文件的改写之类的操作定义。)

二、StreamReader类:读取文件

在 C# 语言中 StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。
    StreamReader 类的构造方法有很多,这里介绍一些常用的构造方法,如下表所示。

构造方法 说明
StreamReader(Stream stream) 为指定的流创建 StreamReader 类的实例
StreamReader(string path) 为指定路径的文件创建 StreamReader 类的实例
StreamReader(Stream stream, Encoding encoding)  用指定的字符编码为指定的流初始化 StreamReader 类的一个新实例
StreamReader(string path, Encoding encoding) 用指定的字符编码为指定的文件名初始化  StreamReader 类的一个新实例

使用该表中的构造方法即可创建 StreamReader 类的实例,通过实例调用其提供的类成 员能进行文件的读取操作。
StreamReader 类中的常用属性和方法如下表所示。

属性或方法 作用
Encoding CurrentEncoding 只读属性,获取当前流中使用的编码方式
bool EndOfStream 只读属性,获取当前的流位置是否在流结尾
void Close() 关闭流
int Peek() 获取流中的下一个字符的整数,如果没有获取到字符, 则返回 -1
int Read() 获取流中的下一个字符的整数
int Read(char[] buffer, int index, int count) 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区
string ReadLine() 从当前流中读取一行字符并将数据作为字符串返回
string ReadToEnd() 读取来自流的当前位置到结尾的所有字符

(依旧先看案例代码,之后再对表。)

1.例

下面通过实例来演示 StreamReader 类的应用。

读取 D 盘 code 文件夹下 test.txt 文件中的信息。

根据题目要求,先在 D 盘下创建文件夹并创建 test.txt 文件,然后写入两行字符,分别是 Hello 和 Lucy,代码如下。

using System;using System.IO;class Program{    static void Main(string[] args)    {        //定义文件路径        string path = @"D:\code\test.txt";        //创建 StreamReader 类的实例        StreamReader streamReader = new StreamReader(path);        //判断文件中是否有字符        while (streamReader.Peek() != -1)        {            //读取文件中的一行字符            string str = streamReader.ReadLine();            Console.WriteLine(str);        }        streamReader.Close();    }}

分析:

首先需要手动载入using System.IO;

然后是定义一个字符串路径,关于“@”这个符合。

在前面加上,就不用写两个双斜杠了。

不加@,就写出"D:\\code\\test.txt"。

创建 StreamReader 类的实例,也就是读取这个文件。

这里要注意的是,如果硬盘D盘的code文件夹下没有text.txt就会报错!

判断文件中是否有字符。

streamReader.Peek():获取流中的下一个字符的整数,如果没有获取到字符, 则返回 -1。

也就是只要不等于-1,就能循环。而返回的是一个int类型。

streamReader.ReadLine():从当前流中读取一行字符并将数据作为字符串返回。

也就是把一行的内容,作为一个字段取出来,再存到一个字符串中。

然后打印这个字符串。

最后就是关闭文件。

就像正常情况下,查看文件内容时,需要打开。不用后还得关闭一样。

注意:

在进行操作时,规定的硬盘目录下必须得有该名称的文件。

同时文件中也需要有内容,否则基本执行成功,也不会出现内容。

运行结果:

txt文件中的内容,就会被打印到命令行中。

而在读取文件中的信息时,除了可以使用 ReadLine 方法以外,还可以使用Read、ReadToEnd方法来读取。

三、StreamWriter类:写入文件

在 C# 语言中与上一节《C# StreamReader 》中介绍的 StreamReader 类对应的是 StreamWriter 类,StreamWriter 类主要用于向流中写入数据。
    StreamWriter 类的构造方法也有很多,这里只列出一些常用的构造方法,如下表所示。

构造方法 说明
StreamWriter(Stream stream)  为指定的流创建 StreamWriter 类的实例
StreamWriter(string path) 为指定路径的文件创建 StreamWriter 类的实例
StreamWriter(Stream stream, Encoding encoding) 用指定的字符编码为指定的流初始化 StreamWriter 类的一个新实例
StreamWriter(string path, Encoding encoding) 用指定的字符编码为指定的文件名初始化 StreamWriter 类的一个新实例

在创建了 StreamWriter 类的实例后即可调用其类成员,完成向文件中写入信息的操作。
StreamWriter 类中常用的属性和方法如下表所示。

属性或方法 作用
bool AutoFlush 属性,获取或设置是否自动刷新缓冲区
Encoding Encoding 只读属性,获取当前流中的编码方式
void Close() 关闭流
void Flush() 刷新缓冲区
void Write(char value) 将字符写入流中
void WriteLine(char value) 将字符换行写入流中
Task WriteAsync(char value) 将字符异步写入流中
Task WriteLineAsync(char value)  将字符异步换行写入流中

在上表中给出的方法中,Write、WriteAsync、WriteLineAsync 方法还有很多不同类型写入的重载方法,这里没有一一列出。

(突然发现,在介绍一个类时,

首先是它的构造方法,也就是创建时直接传参的!

然后就是这个类中的属性和方法!

再然后也就是去看说明,怎么使用了。)

1.例

下面通过实例演示 StreamWriter 类的应用。

向 D 盘 code 文件夹的 test.txt 文件中写入姓名和手机号码。

using System.IO;class Program{    static void Main(string[] args)    {        string path = @"D:\code\test.txt";        //创建StreamWriter 类的实例        StreamWriter streamWriter = new StreamWriter(path);        //向文件中写入姓名        streamWriter.WriteLine("小张");        //向文件中写入手机号        streamWriter.WriteLine("13112345678");        //刷新缓存        streamWriter.Flush();        //关闭流        streamWriter.Close();    }}

分析:

首先定义一个字符串的路径地址文件。

    使用@的意思是不转义\    按说要在字符串里表示c:\windows\notepad.exe    得写成c:\\windows\\notepad.exe

    但是前面加@以后就不用两个\了

然后创建StreamWriter 类的实例。

把字符串路径地址传入进去。(因为有这个构造方法。)

StreamWriter(string path):为指定路径的文件创建 StreamWriter 类的实例。

而这里如果本地不存在该文件,会自动创建。存在这个文件,内部数据会被清空。

streamWriter.WriteLine("小张");

将“小张”作为一行写入。

streamWriter.WriteLine("13112345678");

将“13112345678”作为一行写入。

刷新缓存,并关闭文件。

这算是固定写法了吧!

运行结果:

命令窗口是不会有任何东西了,但创建的这个txt文件内,就多了两行文字。

四、FileStream类:文件读写

在 C# 语言中文件读写流使用 FileStream 类来表示,FileStream 类主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件。
在创建 FileStream 类的实例时还会涉及多个枚举类型的值, 包括 FileAccess、FileMode、FileShare、FileOptions 等。
FileAccess 枚举类型主要用于设置文件的访问方式,具体的枚举值如下。

  • Read:以只读方式打开文件。

  • Write:以写方式打开文件。

  • ReadWrite:以读写方式打开文件。

FileMode 枚举类型主要用于设置文件打开或创建的方式,具体的枚举值如下。

  • CreateNew:创建新文件,如果文件已经存在,则会抛出异常。

  • Create:创建文件,如果文件不存在,则删除原来的文件,重新创建文件。

  • Open:打开已经存在的文件,如果文件不存在,则会抛出异常。

  • OpenOrCreate:打开已经存在的文件,如果文件不存在,则创建文件。

  • Truncate:打开已经存在的文件,并清除文件中的内容,保留文件的创建日期。如果文件不存在,则会抛出异常。

  • Append:打开文件,用于向文件中追加内容,如果文件不存在,则创建一个新文件。

FileShare 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制,具体的枚举值如下。

  • None:谢绝共享当前的文件。

  • Read:允许随后打开文件读取信息。

  • ReadWrite:允许随后打开文件读写信息。

  • Write:允许随后打开文件写入信息。

  • Delete:允许随后删除文件。

  • Inheritable:使文件句柄可由子进程继承。

FileOptions 枚举类型用于设置文件的高级选项,包括文件是否加密、访问后是否删除等,具体的枚举值如下。

  • WriteThrough:指示系统应通过任何中间缓存、直接写入磁盘。

  • None:指示在生成 System.IO.FileStream 对象时不应使用其他选项。

  • Encrypted:指示文件是加密的,只能通过用于加密的同一用户账户来解密。

  • DeleteOnClose:指示当不再使用某个文件时自动删除该文件。

  • SequentialScan:指示按从头到尾的顺序访问文件。

  • RandomAccess:指示随机访问文件。

  • Asynchronous:指示文件可用于异步读取和写入。

FileStream 类的构造方法有很多,这里介绍一些常用的构造方法,如下表所示。

构造方法 说明
FileStream(string path, FileMode mode) 使用指定路径的文件、文件模式创建 FileStream 类的实例
FileStream(string path, FileMode mode, FileAccess access) 使用指定路径的文件、文件打开模式、文件访问模式创建 FileStream 类的实例
FileStream(string path, FileMode mode, FileAccess access, FileShare share) 使用指定的路径、创建模式、读写权限和共享权限创建 FileStream 类的一个新实例
FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options) 使用指定的路径、创建模式、读写权限和共享权限、其他 文件选项创建 FileStream 类的实例

下面使用 FileStream 类的构造方法创建 FileStream 类的实例,语法形式如下。

string path = "D:\\test.txt";FileStream fileStream1 = new FileStream(path, FileMode.Open);FileStream fileStream2 = new FileStream(path, FileMode.Open, FileAccess.Read);FileStream fileStream3 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);FileStream fileStream4 = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 10, FileOptions.None);

分析:

按照上面的构造方法进行捋,你会发现。

第一个参数是:路径文件地址。

第二个参数是:FileMode 枚举类型,Open的值。

说明:打开已经存在的文件,如果文件不存在,则会抛出异常。

第三个参数是:FileAccess 枚举类型。

Write:以写方式打开文件。

ReadWrite:以读写方式打开文件。

第四个参数是:FileShare 枚举类型。

Read:允许随后打开文件读取信息。

第五个参数是:int bufferSize,应该表示缓冲?

第六个参数是:FileOptions 枚举类型。

None:指示在生成 System.IO.FileStream 对象时不应使用其他选项。

(总之就是查表,就好像拿着说明书进行操作一样。)

在创建好 FileStream 类的实例后,即可调用该类中的成员完成读写数据的操作。

FileStream 类中常用的属性和方法如下图所示。

属性或方法 作用
bool CanRead 只读属性,获取一个值,该值指示当前流是否支持读取
bool CanSeek 只读属性,获取一个值,该值指示当前流是否支持查找
bool CanWrite 只读属性,获取一个值,该值指示当前流是否支持写入
bool IsAsync 只读属性,获取一个值,该值指示 FileStream 是异步还 是同步打开的
long Length 只读属性,获取用字节表示的流长度
string Name 只读属性,获取传递给构造方法的 FileStream 的名称
long Position 属性,获取或设置此流的当前位置
int Read(byte[] array, int offset, int count) 从流中读取字节块并将该数据写入给定缓冲区中
int ReadByte() 从文件中读取一个字节,并将读取位置提升一个字节
long Seek(lorig offset, SeekOrigin origin) 将该流的当前位置设置为给定值
void Lock(long position, long length) 防止其他进程读取或写入 System.IO.FileStream
void Unlock(long position, long length) 允许其他进程访问以前锁定的某个文件的全部或部分
void Write(byte[] array, int offset, int count) 将字节块写入文件流
void WriteByte(byte value) 将一个字节写入文件流中的当前位置

1.例

下面通过实例来演示 FileStream 类的应用。

在 D 盘 code 文件夹的 student.txt 文件中写入学生的学号信息。

如果是中文的,bytes 数组的长度将不够用,改成使用byte[] bytes= Encoding.UTF8.GetBytes(message);的方式将数据从字符串类型转换为字节类型。

using System;using System.IO;using System.Text;class Program{    static void Main(string[] args)    {        //定义文件路径        string path = @"D:\\code\\student.txt";        //创建 FileStream 类的实例        FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);        //定义学号        string msg = "1710026";        //将字符串转换为字节数组        byte[] bytes = Encoding.UTF8.GetBytes(msg);        //向文件中写入字节数组        fileStream.Write(bytes, 0, bytes.Length);        //刷新缓冲区        fileStream.Flush();        //关闭流        fileStream.Close();    }}

分析:

同样先是定义一个字符串路径地址。

创建 FileStream 类的实例,属于构造方法中的第四种。

说明:使用指定的路径、创建模式、读写权限和共享权限创建 FileStream 类的一个新实例。

定义学号,再转换成字符数组,再写进去。

因为上面说了,如果是中文的,bytes 数组的长度将不够用,所以需要换成byte[] bytes= Encoding.UTF8.GetBytes(message);的方式。

之后就是刷新缓冲区和关闭文件。

执行后:

注意:

这里文件写入的方法居然是fileStream.Write();

而在控制台写入的,却是 Console.Read();

2.例

从 D 盘的 code 文件夹中将 student.txt 文件中的学号读取出来,并显示到控制台上。

class Program{    static void Main(string[] args)    {        //定义文件路径        string path = @"D:\\code\\student.txt";        //判断是否含有指定文件        if (File.Exists(path))        {            FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);            //定义存放文件信息的字节数组            byte[] bytes = new byte[fileStream.Length];            //读取文件信息            fileStream.Read(bytes, 0, bytes.Length);            //将得到的字节型数组重写编码为字符型数组            char[] c = Encoding.UTF8.GetChars(bytes);            Console.WriteLine("学生的学号为:");            //输出学生的学号            Console.WriteLine(c);            //关闭流            fileStream.Close();        }        else        {            Console.WriteLine("您查看的文件不存在!");        }    }}

分析:

首先依旧是定义一个文件路径。

然后就进行判断是否存在。

如果存在,执行内部操作。如果不存在就直接输出提示。

而内部操作如下:

实例化FileStream类,并且这里用的是第二种构造方法。

说明:使用指定路径的文件、文件打开模式、文件访问模式创建 FileStream 类的实例

定义存放文件信息的字节数组。

fileStream.Length:表示获取文件内部数据的长度。

读取文件信息。

fileStream.Read(bytes, 0, bytes.Length);

第一个参数:获取的字节数组。

第二个参数:从哪个字节开始。

第三个参数:从哪个字节结束。

这里是读取全部。

然后是将得到的字节型数组重写编码为字符型数组。

再在控制台打印输出后,关闭文件。

运行结果:

(今天的内容,开始把文件的写入fileStream.Write();读取fileStream.Read();和控制台的输出Console.Write()输入Console.Read()开始搞混。)

(最后实在没有办法,就决定在进行文件读写时,只要跟控制台的输出输入相反就是对的!)

c# 指定打开某个路径下的CMD_【自学C#】|| 笔记 25 文件的操作相关推荐

  1. c# 指定打开某个路径下的CMD_这招太厉害了,不用鼠标也可以打开指定文件

    大家好,我是小宽呀! 想必大多数的小伙伴打开某个指定的文件都是通过移动鼠标, 或者在笔记本上的触摸板上移动光标,然后一顿狂点之后进入的吧. 今天给大家分享另一种操作姿势,不用通过移动鼠标或用触摸板也能 ...

  2. c# 指定打开某个路径下的CMD_(win10下sublime通过配置JSON调用MATLAB直接运行程序)(转载)...

    SUBLIME作为文本编辑器,本身并不具备仿真功能.但通过配置JSON,可以调用任一程序. https://blog.csdn.net/solinger/article/details/8945016 ...

  3. c# 指定打开某个路径下的CMD_Windows小技巧 批处理文件实现目录下文件批量打包压缩...

    最近整理资料,发现很多 pdf 文档,占用了不少的存储空间,考虑使用 7-zip 进行压缩存储,由于文件比较多,且分散在不同目录下,一个个文件压缩比较繁琐.为了提高效率且,方便后面取用,所有打算捣鼓个 ...

  4. c# 指定打开某个路径下的CMD_Node.js 环境在 Windows 系统下安装与搭建教程

    如果您想了解并深入学习 Node.js 那么您首先要做的第一件事就是安装Node.js .Node.js 环境怎么安装,对于新人来说肯定摸不着头脑.Node 是一个让 JavaScript运行在服务端 ...

  5. C#中获取指定路径下特定开头和后缀的所有文件

    场景 指定一个文件路径,获取当前路径下所有文件,并筛选出以指定内容开头和结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 ...

  6. windows cmd 打开相对路径下的网页文件

    需求 给项目用 Sphix 做了文档,但是最终编译出来的文档入口 index.html 需要进入很多层文件夹后才能找到,如果创建快捷方式,只能在自己的电脑上有用,到其他人电脑上相应的路径就不对了,而 ...

  7. 通过ftp上传数据,写到指定的ftp路径下

    本文是使用一个叫ftplib.c的文件来实现的(如有侵权,请联系我),需要注意的地方时连接上ftp后,创建文件夹的过程,有些ftp服务器不支持递归创建文件夹,需要自己实现递归,我的这个创建文件夹的函数 ...

  8. C#中获取指定路径下指定后缀名的所有文件的路径的list

    场景 指定一个路径和后缀名,查找这个路径下所有以此后缀名结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ...

  9. 查看java源码时出现class文件而不是java文件,可能是因为java的安装路径下没有src.zip文件而是javafx-src.zip文件

    情况说明: 不是maven项目下的源码,就是普通java工程,比如查看System.arraycopy()源码,跳转的时是class文件,并且会提示Decompiled .class file, by ...

最新文章

  1. json对象(json-lib)转换成list-map集合
  2. 建议转变编程时的思维习惯改为:忽略细节关扰,直指问题核心,追寻问题关键。...
  3. Windows下更改MySQL数据库的存储位置
  4. Acdream Path 动态规划
  5. 计算机组成 面试 ---杂货铺
  6. linux vim emmet,前端开发神器Emmet.vim使用笔记
  7. 关键时刻卡成狗,测网速要成上网必备动作了?
  8. MyEclipse常用设置方法
  9. 最全LinuxC语言系统开发资源视频资源
  10. mysql 5.7.26安装教程
  11. python发送短信接口_Python发短信接口
  12. ps画笔工具、填充选区文字工具、合成
  13. 徘徊过多少橱窗 住过多少旅馆 才会觉得分离也并不冤枉
  14. 本地同城小程序开发需要具备什么功能
  15. c语言逻辑运算符两侧运算对象,逻辑运算符两侧运算对象的数据类型是什么?...
  16. linux账号与群组
  17. 使用Hibernate进行CRUD操作
  18. SAP调研问卷(草稿)
  19. 语言环境设置命令locale 命令(linux,对应于window 7(win叫什么命令?)控制面板-区域和语言里的设置)
  20. 日常上网必备趣味,实用的100个网站

热门文章

  1. 微信公众号的文章中添加历史文章链接
  2. 《Cortex-M0权威指南》之Cortex-M0技术综述
  3. 妲己机器人怎么升级固件_OnRobot新增爱普生川崎机器人套件、HEX固件升级
  4. 一个项目有两个pom_Python Selenium设计模式之POM设计模式
  5. 特斯拉得克萨斯超级工厂正式开业 计划明年开始生产电动皮卡
  6. 不下载APP就不能看全文?工信部出手了...
  7. 申通快递:1月快递服务业务收入25.65亿元 同比增长21.27%
  8. 数百名车主因断网被锁车外 马斯克:将确保此类事件不再发生
  9. 理想回应800倍高阶收EPB驻车芯片:不属实
  10. 顺丰同城宣布苏炳添出任首位品牌代言人