流 Stream 事例
多数应用程序的基本任务是操作数据,这就需要对数据进行访问和保存,即对数据进行读/写操作,用程序访问一个文本文件的操作叫做"读";对文件文件的内容进行修改后保存这些修改的操作被称为"写".
C#提供了一个名为System.IO的名称空间,用于对文本和流进行处理。
IO名称空间包括的类主要用于对文件和数据进行读/写,并提供基本的文件和目录支持
C#中的流处理:
BinaryReader 和 BinaryWrite类,以二进制格式操作数据
Close() 关闭当前阅读器及基础流
Read() 从基础流中读取字符并前移流的当前位置
ReadDecimal() 从当前流中读取十进制数值,并将该流的当前位置前移16个字节
ReadByte() 从当前流中读取下一个字节,并将在流中的位置向前移动1个字节
Stream类
Stream类是IO名称空间中最重要的类之一,它是派生FileStream、MemoryStream和BufferedStream等不同类的抽象类
MemoryStream类用于向内存(而不是磁盘)读写数据
Read() 读MemoryStream并装值写入缓冲区
ReadByte() 从MemoryStream读一个字节
Write() 从缓冲区向MemoryStream写值
WriteByte() 从缓冲区向MemoryStream写一个字节
WriteTo() 将此内存流的内容写入别一个内存流
BufferedStream类用于对缓冲区进行读/写。有两个构造函数
public BufferedStream(Stream stName);
public BufferedStream(Stream stName, int bsize); // bsize表示缓冲区大小
static void Main(string[] args)
{
MemoryStream memStr = new MemoryStream();
BufferedStream buffStr = new BufferedStream(memStr);
buffStr.WriteByte((byte)100);
buffStr.Position = 0; //取得memStr的当前位置Positon属性为0,以便buffStr的当前位置设置为流的开始
byte[] arrb = { 1, 2, 3 };
buffStr.Read(arrb, 0, 1); // 用流的当前位置的值填充字节数组arrb
for (int i = 0; i < 3; i++)
{
Console.WriteLine("这个值是{0}", arrb[i]);
}
Console.WriteLine("ReadByte()的返回值是{0}", buffStr.ReadByte()); // 返回-1表示流的末尾
Console.ReadKey();
}
FileStream类
FileStream 类用于对文件执行读/写操作,Read()和Write()方法用于读/写操作
FileStream类构造函数有许多重写形式,以方便创建该类的实例
FileStream(string FilePath,FileMode)
FileStream(stirng FilePath,FileMode,FileAccess)
FileStream(string FilePath,FileMode,FileAccess,FileShare)
FileMode为enum类型,其值如下:
Append:打开一个文件并查找到文件末尾,以便能够附加新的数据,如果文件不存在,则新建一个文件
Create:用指定名称新建一个文件,如果存在具有相同名称的文件,则覆盖旧文件
CreateNew:新建一个文件
Open:打开一个文件,指定文件必须存在
OpenOrCreate:与Open类似,只是指定文件不存在时,新建一个
Truncate:根据此枚举,打开指定文件并将之截断为0字节(大小为0字节),文件必须存在
FileAccess枚举值:Read / Write / ReadWrite
FileShare枚举值:
None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求都将失败
Read:只能对文件进行读取操作
Write:可以对文件进行写入操作
ReadWrite:可以进行对文件的读写和写入两种操作
static void Main(string[] args)
{
Console.WriteLine("输入文件的名称:");
string filename = Console.ReadLine();
FileStream fileStr = new FileStream(filename, FileMode.OpenOrCreate);
BinaryWriter binWrt = new BinaryWriter(fileStr);
for (int i = 0; i < 20; i++)
{
binWrt.Write(i);
}
binWrt.Close();
fileStr.Close();
fileStr = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader binRead = new BinaryReader(fileStr);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(binRead.ReadInt32());
}
binRead.Close();
fileStr.Close();
Console.ReadKey();
}
TextReader类
TextReader类是StreamReader和StringReader类的抽象基类,可用于读取有序的字符序列
Read() 读取输入流中的下一个字符或下一组字符
ReadLine() 从当前流中读取一行字符并将数据作为字符串返回
ReadToEnd() 从流的当前位置到末尾读取流
class Program
{
static string ans = "y";
static void Main(string[] args)
{
Console.WriteLine("1.读取文件");
Console.WriteLine("2.读取字符串");
try
{
Reading();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
static void Reading()
{
if (ans == "Y" || ans == "y")
{
Console.Write("输入你的选择[1/2]:");
int choice = Convert.ToInt32(Console.ReadLine());
if (choice == 1)
{
Console.WriteLine("输入文件名:");
string filename = Console.ReadLine();
if (!File.Exists(filename))
{
Console.WriteLine(filename + "不存在!");
return;
}
StreamReader sr = File.OpenText(filename);
string input;
while ((input = sr.ReadLine()) != null)
{
Console.WriteLine(input);
}
Console.WriteLine("已达到流末尾。");
sr.Close();
Console.Write("要继续吗?[Y/N]:");
ans = Console.ReadLine();
Reading();
}
else if (choice == 2)
{
Console.Write("输入字符串:");
string str = Console.ReadLine();
char[] b = new char[str.Length];
StringReader sr = new StringReader(str);
sr.Read(b, 0, str.Length);
Console.WriteLine(b);
Console.WriteLine("要继续吗[Y/N]:");
ans = Console.ReadLine();
Reading();
}
else
{
Console.WriteLine("输入1或2作为选择:");
}
}
}
}
TextWrite类
TextWrite类用于编写有序字符的类的抽象基类。StreamWriter和StringWriter类是TextWriter类的两个派生类
Write() 将数据写入流
WriteLine() 将数据写入流,并在结尾标记结束符
StringWriter类用于装数据写入字符串,与StreamWriter类类似,区别仅在于它是向字符串(而不是向流)写入
class Program
{
static string ans = "y";
static void Main(string[] args)
{
Writing();
}
static void Writing()
{
if (ans == "Y" || ans == "y")
{
Console.WriteLine("输入文件名:");
string filename = Console.ReadLine();
if (!File.Exists(filename))
{
Console.WriteLine(filename + "不存在!");
return;
}
StreamWriter sr = File.AppendText(filename);
Console.Write("输入要写入的字符串:");
string str = Console.ReadLine();
sr.WriteLine(str);
sr.Close();
Console.Write("要继续吗?[Y/N]:");
ans = Console.ReadLine();
Writing();
}
}
}
浙公网安备 33010602011771号