佳佳的博客
Menu
首页
《.NET Core 实战》 [No.253~259] 流
Posted by
佳佳
on 2020-03-24
IT
C#
.NET Core
《.NET Core 实战》
读书笔记
<!-- # 《.NET Core 实战》 [No.253~259] 流 --> <!-- dotnet-core-stream --> **流**,是输入/输出操作中很常用的一种类型,它表示 **数据内容的字节按照顺序进行排列**。 ## 内存流(*MemoryStream*) **内存流**,即从内存中划分出一个特定区域,应用程序可以将字节序列存放到这个区域中。 内存流很适合用于读写临时数据。 `MemoryStream` 类封装了一系列操作内存流的方法。 下面的示例代码展示了 `MemoryStream` 类的如下功能: - 写入内容至内存流 - *Write* 方法 - 两种读取内存流内容的方法 - *ToArray* 方法 - *Read* 方法 - 重置内存流的当前位置 - *Seek* 方法 - *Position* 属性(*0* 表示流的开始) ```csharp using (MemoryStream stream = new MemoryStream()) { // 写入内容 byte[] buffer = { 19, 90, 1, 18, 12, 0 }; stream.Write(buffer, 0, buffer.Length); // 从流中重新提取字节数组 var array = stream.ToArray(); Console.WriteLine(BitConverter.ToString(array)); // 13-5A-01-12-0C-00 // 将读写指针复位 stream.Position = 0L; buffer = new byte[stream.Length]; // 从流中读取刚刚写入的字节 stream.Read(buffer, 0, buffer.Length); Console.WriteLine(BitConverter.ToString(buffer)); // 13-5A-01-12-0C-00 // 使用 Seek 方法重新设置流的当前位置 stream.Seek(2, SeekOrigin.Begin); buffer = new byte[2]; for (int i = 0; i < 2; i++) { Console.Write($" ox{stream.ReadByte():x2}"); // ox01 ox12 } Console.WriteLine(); buffer = new byte[2]; stream.Read(buffer, 0, buffer.Length); Console.WriteLine(BitConverter.ToString(buffer)); // 0C-00 // 使用 Position 属性也可以更改流的当前位置 stream.Position = 2L; buffer = new byte[stream.Length - 2]; stream.Read(buffer, 0, buffer.Length); Console.WriteLine(BitConverter.ToString(buffer)); // 01-12-0C-00 } ``` ## *StreamWriter* & *StreamReader* 使用 `StreamWriter` & `StreamReader` 写入和读取文本文件 `StreamWriter` 支持以流的形式将内容写入文件。 `StreamWriter` 默认采用 *UTF-8* 编码,可以在初始化时指定编码格式。 `StreamWriter` 适用于各种类型的流,如内存流、文件流等。 常用写入方法: - *Write* - *WrrteLine*:自动在写入的内容后面追加换行符 ```csharp // 使用 StreamWriter 类将文本写入文件 using (StreamWriter writer = new StreamWriter("abc.txt")) { writer.WriteLine(1990); writer.Write(1.18M); writer.Write("test"); writer.WriteLine(false); writer.Write(DateTime.Today); } ``` `StreamReader` 以文本形式读取流中的内容。 常用的读取方法如下: - *Read*:读取一个字符,以 `int` 类型返回;此方法的其它重载支持读取多个字符,结果储存在 `char` 数组中。 - *ReadLine*:每次读取一行。 - *ReadToEnd*:一次性读取所有文本。 如何判断读取指针已经到了流的末尾: 1. 调用 *Peek* 方法。 该方法会读取下一个字符,但不会执行读取。如果没有可用字符,方法返回 *-1* 。 2. 检查 *Read* 或 *ReadLine* 方法的返回值。 - *ReadLine* 方法返回值为 *null* - *Read* 方法的返回值为 *-1* ```csharp // 使用 StreamReader 类读取文本文件 using (StreamReader reader = new StreamReader("abc.txt")) { string line = null; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } ``` --- > 购买本书 => [《.NET Core实战:手把手教你掌握380个精彩案例》][10] -- *周家安* 著 --- [10]:https://union-click.jd.com/jdc?e=&p=AyIGZRhaEwAQBFUZXBIyEgRSEl0QCxc3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFQ5THlIQMm1AEkRdb11GZyNTK0BBZwYIbylWcHILWStaJQITBlYbXB0LFQJlK1sSMkBpja3tzaejG4Gx1MCKhTdUK1sRCxQBVxtTEQIQBlwrXBULIloNXwZBXUReEStrJQEiN2UbaxYyUGlUG1kUBhcGUBILQgUXDlMeUkBVRlUBS10XBkIABhkJRzIQBlQfUg%3D%3D (《.NET Core实战:手把手教你掌握380个精彩案例》)
版权声明:原创文章,未经允许不得转载。
https://www.liujiajia.me/2020/3/24/dotnet-core-stream
“Buy me a nongfu spring”
« 《.NET Core 实战》 [No.260~262] 压缩与解压缩
《.NET Core 实战》 [No.241~252] 目录与文件 »
Commented by
lindexi
on 2020-10-19
回复
换行符有坑是各个平台的文本换行符不同
昵称
*
电子邮箱
*
回复内容
*
(回复审核后才会显示)
提交
目录
AUTHOR
刘佳佳
江苏 - 苏州
软件工程师
梦嘉集团
lindexi
on 2020-10-19 回复