C# StreamReader类和StreamWriter类

774cea8e9deb33b6edea69f58e6fafd4.png

先看看 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);
    }
  }
}

05b51956520a680a709e7ffa3e83a19d.png

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

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

5d996407056c198c14072f62a3f421ad.png

也可以显式地指定编码:

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

2c8d039f9c01c37d8f9d378fac81a59a.png

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

e75ce72bd770bc05fca8e59c62259ddb.png

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

var reader = File.OpenText(fileName);

e3b529fc291025bc20d7fce994eb3ec9.png

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

string content = reader.ReadToEnd();

dd5fe22f478bd12e1c13422c224c8c34.png

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);

7142960ea25fa8af90c32ffafcd0a910.png

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);
  }
}

51f90321822b5cb2f48cec44a484003f.png

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

60f653d0e48d6074f443b4b281ff2b5f.png

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

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值