1.Stream类
(1)FileStream 文件流,将文件以字节的方式进行读写(char 占两个字节,byte占一个字节)
构造方法:new FileStream(文件路径,FileMode,FileAccess);
读写方法:
int ReadByte();//读取一个字节
void WriteByte(byte);
int Read(byte[] buffer, int offset, int count);//函数返回值是读取到的字节数,读取的字节流存放在buffer数组中,offset为读取的第一个字节存储在数组中的位置,count为读取的字节数。
void Write(byte[] buffer,int offset,int count);//将buffer数组从下标为offset的位置开始将count个byte输入文件流
void Flush();//往清空缓存,写入硬盘。有时往文件流写入数据但是程序非法结束未调用Flush()数据未成功写入文件流
void Dispose();//清空非托管资源
Flush()和Dispose()的功能类似,也可以将FileStream类的实例化写在using语句中,程序执行完using语句后会自动调用对象的Flush()。格式如下:
Position属性//文件处理,指针指向的文本文件的位置
文件流对象的定义:
FileStream writeStream = new FileStream(“test.dat”,
FileMode.Create, FileAccess.Write);
//"test.dat"为文件名,FileAcess.Write表名可以往该文件里写入数据
FileMode:Create,CreateNew,Append,Open
FileAccess:Read,Write,ReadWrite
注意:Create新建一个文件,文件若已存在则删除新建一个,CreateNew新建一个文件文件若已存在则报错,Append为打开一个文件往文件末尾追加数据。
往文件里写数据:
写一个字节:writeStream .WriteByte(33);
写一个字节数组,从下标0开始,一共写3个字节:writeStream .Write(new byte[] { 34, 35, 36 }, 0, 3);
关闭文件流(会将没有写完的数据写完,然后释放资源):
writeStream .Close();
另一个读文件的例子:
FileStream readStream= new FileStream(“test.dat”,
FileMode.Open, FileAccess.Read);
for (int b = readStream.ReadByte(); b!=-1; b = readStream.ReadByte())//ReadByte:读一个字节,如果已经结束,返回-1
{
Console.WriteLine(b);
}
(2).StreamReader与StreamWriter专门对文本文件的读写操作
读流:new StreamReader("文件路径",Encoding);
方法:
string ReadLine();//读取文件的一行
string ReadToEnd();//读取所有的内容
写流:
new StreamWriter("文件路径",bool isAppend, Encoding);
写的方法:
void Write(...);//写入内容
void WriteLine(...);//写入一行文本
2.MemoryStream类,和文件流一样的读写(不需要指定访问形式,既可读又可写)
byte[] array = { 33, 34, 35, 36, 37 };
MemoryStream readStream= new MemoryStream(array);
MemoryStream writeStream= new MemoryStream();
int b;
while ((b = readStream.ReadByte()) != -1){
writeStream.WriteByte((byte)(b + 3));
}
byte[] result = writeStream.ToArray();
Array.ForEach(result, bt => Console.WriteLine(bt));
3.二进制读写(new一个BinaryWriter或BinaryReader类的对象并将FileStream类的对象作为构造函数的实参初始化便可对一个FileStream对象的文件进行二进制的读写)
形式:
上例中reader.ReadString()等各种读操作的顺序须与writer.Writer()的不同数据写入的顺序相同,否则输出结果会发生错误。
注意:文件流的WriteByte()是一个字节一个字节的写入,而如果传入一个char类型的参数会出现乱码。
如果想把字符串写入可以添加如下代码:
Encoding.Default.GetBytes(s);
但是不能只输入一个字节: