使用 Streams
流是一种提供传输数据的低级方法的对象。它们本身并不充当数据容器。
我们处理的数据是字节数组(byte []
)的形式。读取和写入的功能都是以字节为导向的,例如 WriteByte()
。
没有用于处理整数,字符串等的函数。这使得流非常通用,但是如果你只是想传输文本,则不太简单。在处理大量数据时,Streams 可能特别有用。
我们需要使用不同类型的 Stream,它需要在哪里写入/读取(即后备存储)。例如,如果源是文件,我们需要使用 FileStream
:
string filePath = @"c:\Users\exampleuser\Documents\userinputlog.txt";
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// do stuff here...
fs.Close();
}
同样,如果后备存储是内存,则使用 MemoryStream
:
// Read all bytes in from a file on the disk.
byte[] file = File.ReadAllBytes(“C:\\file.txt”);
// Create a memory stream from those bytes.
using (MemoryStream memory = new MemoryStream(file))
{
// do stuff here...
}
同样,System.Net.Sockets.NetworkStream
用于网络访问。
所有 Streams 都来自通用类 System.IO.Stream
。无法直接从流中读取或写入数据。 .NET Framework 提供了诸如 StreamReader
,StreamWriter
,BinaryReader
和 BinaryWriter
等辅助类,它们在本机类型和低级流接口之间进行转换,并为你传输数据到流中或从流中传输数据。
读取和写入流可以通过 StreamReader
和 StreamWriter
完成。关闭这些时应该小心。默认情况下,关闭也将关闭包含的流,并使其无法用于进一步的使用。可以使用具有 bool leaveOpen
参数并将其值设置为 true
的构造函数来更改此默认行为。
StreamWriter
:
FileStream fs = new FileStream("sample.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
string NextLine = "This is the appended line.";
sw.Write(NextLine);
sw.Close();
//fs.Close(); There is no need to close fs. Closing sw will also close the stream it contains.
StreamReader
:
using (var ms = new MemoryStream())
{
StreamWriter sw = new StreamWriter(ms);
sw.Write(123);
//sw.Close(); This will close ms and when we try to use ms later it will cause an exception
sw.Flush(); //You can send the remaining data to stream. Closing will do this automatically
// We need to set the position to 0 in order to read
// from the beginning.
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
var myStr = sr.ReadToEnd();
sr.Close();
ms.Close();
}
由于类 Stream
,StreamReader
,StreamWriter
等实现了 IDisposable
接口,我们可以在这些类的对象上调用 Dispose()
方法。