1、数据流操作
数据流提供了一种向后被存储写入字节和从后被存储读取字节的方式,他是在.NET中执行读写文件操作时的一种非常重要的介质。
(1)流操作类介绍
.NET使用流来支持读取和写入文件,开发人员可以将流视为一组连续的一维数据,包含开头和结尾,并且其中的游标指示了流中的当前位置。
流操作
流中包含的数据可能来自内存、文件或TCP/IP套接字,流包含一下几种可以应用于自身的基本操作:
读取:将数据从流传输到数据结构(字符串或者字节数组)中。
写入:将数据从数据源传输到流中。
查找:查询和修改在流中的位置。
流的类型
在.NET中,流必须由Stream类来表示,该类构成了所有其他流的抽象类。不能直接创建Stream类的实例,但是必须使用它实现的其中一个类。
C#中有许多类型的流,但在处理文件输入/输出(I/O)时候,最重要的类型为FileStream类,他是提供读取和写入文件的方式。可在处理文件I/O的时候使用的其他流主要包含BufferedStream、CrypyoStream、MemoryStream和NetworkStream等。
(2)文件流类
C#中,文件流类使用FileStream类表示,该类公开以文件为主的Stream,表示在磁盘或者网络路径上指向文件的流。一个FileStream类的实例实际上代表一个磁盘文件,通过Seek的方法进行对文件的随机访问,也同时包含了流的标准输入、标准输出和标准错误等。FileStream默认对文件的打开方式是同步的,但是他同样也很好的支持异步操作。
注意:FileStream对象支持使用Seek的方法对文件进行随机访问,Seek方法允许将读取/写入位置移动到文件中的任意位置。
FileStream类的常用属性
CanRead:获取一个值,该值指示当前流是否支持读取。
CanSeek:获取一个值,该值指示当前流是否支持查找。
CanTimeout:获取一个值,该值确定当前流是否可以超时。
CanWrite:获取一个值,该值指示当前流是否支持写入。
IsAsync:获取一个值,该值指示FileStream是异步还是同步打开的。
Length:获取用字节表示的流长度。
Name:获取传递给构造函数的FileStream的名称。
Position:获取或设置此流的当前位置。
ReadTimeout:获取或设置一个值,该值确定流在超时前尝试读取多长时间。
WriteTimeout:获取或设置一个值,该值确定流在超时前尝试写入多长时间。
FileStream类的常用方法
BeginRead:开始异步读操作。
BeginWrite:开始异步写操作。
Close:关闭当前流并且释放与其关联的资源。
EndRead:等待挂起的异步读取完成。
EndWrite:结束异步写入,在IO操作完成之前一直阻止。
Lock:允许读取访问的同时,防止其他进程更改FileStream.
Read:从流中读取字节块并且将该数据写入给定缓存区。
ReadByte:从文件中读取一个字节,并且将读取位置提升一个字节。
Seek:将该流的当前位置设置为给定值。
SetLength:将该流的长度设置为给定值。
Unlock:允许其他进程访问以前锁定的某个文件的全部或部分。
Write:使用从缓冲区读取的数据将字节块写入该流。
FileAccess
示例:
FileStream a=new FileStream ("Test.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite);
//使用上面代码的时候,Text.txt文件要放在程序运行目录下,否则就需要给构造函数传递绝对路径。
(3)文本文件的写入和读取
StreamWrite类
StreamWrite类是专门处理文本文件的类。可以方便向文本文件中写入字符串,同时也负责重要的转换和处理向FileStream对象写入工作。
注意:StreamWriter类默认使用UTF-8编码来进行创建。
StreamWriter类属性
Encoding:获取将输入写入到其中的Encoding。
Formatprovider:获取控制格式设置的对象。
NewLine:获取或设置由当前TextWriter使用的行结束符字符串。
StreamWriter类方法
Close:关闭当前的StringWriter和基础流。
Writer:写入到StringWrite的此实例。
WriteLine:写入重载参数指定的某些数据,后跟行结束符。
StreamWriter类有两个最重要、最常用的方法:Write方法,另一个WriteLine。这两个方法都是用来向文本文件中写入字符串的。WriteLine方法只用于字符串,并且会自动追加换行符。而Write方法不追加换行符。而且可以向文本流写入字符串及任何基本数据类型的文本形式。
StreamReader类
这个类专门进行读取文本文件的类。StreamReader类可以从底层Stream对象创建StreamReader对象的实例,而且也能指定编码规范参数。创建StreamReader对象后,提供了许多用于读取和浏览字符数据的方法。
StreamReader类的常用方法:
Close:关闭StringReader。
Read:读取输入字符串中的下一个字符或下一组字符。
ReadBlock:从当前流中读取最大count的字符并从index开始将该数据写入Buffer。
ReadLine:从基础字符串中读取一行。
ReadToEnd:将整个流,从流的当前位置到流的结尾作为字符串读取。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == string.Empty)
{
MessageBox.Show("要写入的文件为空,错误!!");
}
else
{
saveFileDialog1.Filter = "文本文件(*.txt)|*.txt";
//设置保存格式
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,true);
//向创建的文件中写入内容
sw.WriteLine(textBox1.Text);
sw.Close();
textBox1.Text = string.Empty;
}
}
}
private void button2_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "文本文件(*.txt)|*.txt";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = string.Empty;
StreamReader sr = new StreamReader(openFileDialog1.FileName);
textBox1.Text = sr.ReadToEnd();
sr.Close();
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
(4)二进制文件的写入和读取
二进制文件的写入和读取主要是通过BinaryWriter类和BinaryReader类来实现的,下面对这两个类进行分析讲解。
BinaryWriter类
BinaryWriter类以二进制的形式将基元类型写入流,并且支持用特定的编码写入字符串,其常用的方法和说明如下:
Close:关闭当前的BinaryWriter类和基础流。
Seek:设置当前流中的位置。
Write:将值写入当前流。
BinaryReader类
BinaryReader类用特定的编码将基元数据类型读作二进制值,其常用方法和说明如下:
Close:关闭当前阅读器及基础流.
PeekChar:返回下一个可用的字符,并且不提升字节或者字符的位置。
Read:从基础流中读取字符,并且提升流的当前位置。
ReadBoolean:从当前流中读取Boolean值,并且使该流的当前位置提升一个字节。
ReadByte:从当前流中读取下一个字节,并且使流的当前位置提升一个字节。
ReadBytes:从当前流中读取count个字节读入字节数组,并且使当前位置提升count个字节。
ReadChar:从当前流中读取下一个字符,并且根据Encoding和从流中读取的特定字符,提升流的当前位置。
ReadChars:从当前流中读取count个字符,以字符数组的形式返回数据。并根据所使用的Encoding和从流中读取的特定字符,提升流的当前位置。
ReadInt32:从流中读取4字节有符号整数,并且使流的当前位置提升4个字节。
ReadString:从流中读取一个字符串。字符串有长度前缀,一次将七位编码为整数。
示例程序:同上面的程序,不同方法,实现相同功能。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == string.Empty)
{
MessageBox.Show("要写入的文件为空,错误!!");
}
else
{
saveFileDialog1.Filter = " 二进制文件 (*.dat)|*.dat";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
FileStream m = new FileStream(saveFileDialog1.FileName,FileMode.OpenOrCreate
,FileAccess.ReadWrite);
BinaryWriter sw = new BinaryWriter(m);
//使用FileStream创建BinaryWriter,二进制读写流。
sw.Write(textBox1.Text);//向创建文件写入内容
sw.Close();//关闭二进制写入流
m.Close();//关闭文件流
textBox1.Text = string.Empty;
}
}
}
private void button2_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "二进制文件(*.dat)|*.dat";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = string.Empty;
FileStream m = new FileStream(openFileDialog1.FileName,FileMode.OpenOrCreate,
FileAccess.ReadWrite);
BinaryReader sr = new BinaryReader(m);
if(sr.PeekChar()!=-1)//判断是否还有数据
{
textBox1.Text = Convert.ToString(sr.ReadString());//对其进行转换
}
sr.Close();
m.Close();
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}