先看看 StreamReader,将前面的示例转换为读取文件以使用 StreamReader。它现在看起来容易得多。StreamReader 的构造函数接收FileStream。使用 EndOfStream 属性可以检查文件的末尾,使用ReadLine 方法读取文本行:

public static void ReadFileUsingReader(string fileName)
{var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);using (var reader = new StreamReader(stream)){while (!reader.EndofStream){string line = reader.ReadLine(); Console.WriteLine(line);}}
}

不再需要处理字节数组和编码。然而注意,StreamReader 默认使用 UTF-8 编码。指定另一个构造函数,可以让 StreamReader 使用文件中序言定义的编码:

var reader = new StreamReader(stream, detectEncodingFromByteOrderMarks: true);

也可以显式地指定编码:

var reader = new StreamReader(stream, Encoding.Unicode);

其他构造函数允许设置要使用的缓冲区;默认为 1024 个字节。此外,还可以指定关闭读取器时不应该关闭底层流。默认情况下,关闭读取器时(使用 Dispose 方法),会关闭底层流。

不显式实例化新的 StreamReader,而可以使用 File 类的 OpenText 方法创建StreamReader:

var reader = File.OpenText(fileName);

对于读取文件的代码片段,该文件使用 ReadLine 方法逐行读取。StreamReader还允许在流中使用 ReadToEnd 从光标的位置读取完整的文件:

string content = reader.ReadToEnd();

StreamReader 还允许把内容读入一个字符数组。这类似于 Stream 类的 Read 方法;它不读入字节数组,而是读入 char 数组。记住,char 类型使用两个字节。这适合于 16 位 Unicode,但不适合于 UTF-8,其中,一个字符的长度可以是 1 至 6 个字节:

int nChars = 100;
char[] charArray = new char[nChars];
int nCharsRead = reader.Read(charArray, 0, nChars);

StreamWriter 的工作方式与 StreamReader 相同,只是 StreamWriter 仅用于写入文件(或写入另一个流)。下面的代码片段传递 FileStream,创建了一个 StreamWriter。然后把传入的字符串数组写入流:

public static void WritefileUsingWriter(string fileName, string[] lines)
{var outputStream = File.OpenWrite(fileName); using (var writer = new StreamWriter(outputStream)) {byte[] preamble = Encoding.UTF8.GetPreamble();outputStream.Write(preamble, 0, preamble.Length);  writer.Write(lines);}
}

记住,StreamWriter 默认使用 UTF-8 格式写入文本内容。通过在构造函数中设置 Encoding 对象,可以定义替代的内容。另外,类似于 StreamReader 的构造函数,StreamWriter 允许指定缓冲区的大小,以及关闭写入器时是否不应该关闭底层流。

StreamWriter 的 Write() 方法定义了 17 个重载版本,允许传递字符串和一些 .NET 数据类型。请记住,使用传递 .NET 数据类型的方法,这些都会使用指定的编码变成字符串。

 微信公众号 

Dotnet讲堂

C# StreamReader类和StreamWriter类相关推荐

  1. C#使用StreamReader类和StreamWriter类读写文本文件

    StreamReader类和StreamWriter类可以实现读写文本文件,这两个类都在命名空间System.IO下. using System; using System.Collections.G ...

  2. C# 第七章『I/O数据流』◆第5节:数据流—StreamWriter类、StreamReader类

    FileStream类的对象只能以字节的形式读取/写入数据,这就使操作变得非常困难,所以需要借用StreamWriter对象或StreamReader对象的方法来处理文件. 一.StreamWrite ...

  3. C# StreamReader/StreamWriter类

    本章介绍:StreamReader/StreamWriter类: 命名空间:using System.IO 1.StreamReader/StreamWriter类:用来处理流数据,提供了高效的流读写 ...

  4. C#使用StreamWriter类写入文件文件

    除了使用FileStream类读写文本文件,.net还提供了StreamWriter类和StreamReader类专门处理文本文件.这两个类从底层封装了文件流,读写时不用重新编码,提供了更文件的读写方 ...

  5. C#的StreamWriter类使用说明

    C#的StreamWriter类使用说明 一:StreamWriter类简单说明 二:StreamWriter类的构造函数 三:StreamWriter类的字段 四:StreamWriter类的属性 ...

  6. 指定得文件初始化StreamWriter类得新实例

    Initializes a new instance of the System.IO.StreamWriter class for the specified // stream by using ...

  7. File类与FileInfo类的区别

    这些年代码也写了不少,关于文件I/O的操作也写了很多,基本上File类与FileInfo类也没有刻意的去看性能,有时用着也挺糊涂的,今天就将这些I/0操作总结下,老样子贴码 首先先了解清楚下File类 ...

  8. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...

  9. WebRequest 类和 WebResponse 类

    WebRequest类和WebResponse类 WebClient类使用起来比较简单,但是它的功能非常有限,特别是不能使用它提供身份验证证书.这样,在上传数据时问题就出现了,许多站点都不会接受没有身 ...

最新文章

  1. vue 获取当前时间 格式YYYY-MM-DD
  2. hadoop 9000端口的服务未启动_IDEA 微服务单项目多端口启动
  3. 在WebStorm里配置watcher实现编辑less文件时自动生成.map和压缩后的.css文件
  4. 一步一步详解ID3和C4.5的C++实现
  5. Redis源码剖析(五)订阅与发布
  6. 相信应该有百分九十的男生看见这个东西是这个状态吧?
  7. #4604. The kth maximum number(整体二分 + 树套树)
  8. 最通俗易懂的乐观锁与悲观锁原理及实现
  9. 解决ERROR 1044 (42000): Access denied for user
  10. qt5.4 for android,windows下Qt5.4.2 for android开发环境配置
  11. vscdoe之通过Ctrl+S实现代码格式自动化
  12. raid5坏了一块盘怎么办_如果你的硬盘坏了 你的照片还能找回来吗?
  13. 中国营养与健康调查(CHNS)2018年最新数据
  14. Android开发中验证码的生成
  15. Android源码下载编译(TI)
  16. 移动边缘计算——计算卸载
  17. Java实现剪切MP3格式的文件_java_java实现酷狗音乐临时缓存文件转换为MP3文件的方法,本文实例讲述了java实现酷狗音 - phpStudy...
  18. 39元超值!360超级充电器拆解与评测
  19. 十大api接口平台(接口商)
  20. MATLAB电话拨号音仿真,MATLAB电话拨号音的合成与识别

热门文章

  1. nginx log_format详解
  2. OC开发_Storyboard——MapKit
  3. flash builder 4.7 debug via usb device iPhone 4s - device not found
  4. Spring Security3源码分析-http标签解析(转)
  5. Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?
  6. 做个中国清官网,有人感兴趣吗
  7. 华为首款鸿蒙设备正式入网,华为首款鸿蒙设备正式入网:麒麟9000+挖孔全面屏,价格感人!...
  8. python并行for循环_Python并行执行for循环
  9. Ajax跨域提交JSON和JSONP
  10. UIView 的基础