对与流类的相关操作,需要对比分清各种操作之间的相互关系。
即File类,FileInfo,FileStream,StreamWriter,StreamBuffered等各类之间的关系。
File类属于静态类,仅是打开,复制,移动或删除文件,且在未实例化前即可进行相关操作。
FileInfo类则需要实例化,在多次操作时有优点。创建方式:FileInfo aFile=new FileInfo(@"~\data.txt");
相同点:FileInfo aFile=new FileInfo("data.txt"); if (aFile.Exists) Console.WriteLine("aFile Exists");
if (File.Exists("data.txt") Console.WriteLine("File Exists");
FileStream类则是进行字节读取的流对象。创建方式:1>FileStream aFile=new FileStream(filename,FileMode.Member, FileAccess.Member);
相同点:打开只读(写)文件 FileStream aFile=File.OpenRead("data.txt");
FileInfo aFileInfo=new FileInfo("data.txt"); FileStream aFile=aFileInfo.OpenRead();
StreamWriter运行进行字符的操作。创建方式:1>StreamWriter sw=new StreamWriter("data.txt",true);
2>FileStream aFile=new FileStream("data.txt",FileMode.CreateNew); StreamWriter sw = new StreamWriter(aFile);
字节转换为字符:Decoder d=Encoding.UTF8.GetDecoder(); d.GetChars(byData,0,byData.Length,charData,0);
字符转换为字节:Encoder d=Encoding.UTF8.GetEncoder(); d.GetBytes(charData,0,charData.Length,byData,0,true);
文件读写
C#和java对于文件的操作的思路有点相似,都是采用管道技术和流操作—Stream来实现相应的功能.,开始操作文件的时候用到文件专用流:System.IO命名空间下的Filestream.,其构造函数有很多,现在先介绍一个很常用的方法:
FileStream 构造函数 (String, FileMode);
FileMode有:open,create,openOrcreate,createnew.append, Truncate等几种模式.
下面先看一个例子:
FileInfo mynewfile = new FileInfo("C:\\myfile.txt");//
FileStream sf = new FileStream(mynewfile.ToString(), FileMode.Create);//构造函数,以创建模式打开目标文件,如果不存在就创建相应的文件.
byte[] dataArray = new byte[100000];//字节
new Random().NextBytes(dataArray);//创建随机字节
for (int i = 0; i < dataArray.Length; i++)
{
sf.WriteByte(dataArray[i]);//将字节写入文件理.
}
其他构造方法有:
我在这里就不多介绍了,大家可以参考Msdn的文件.关于文件的读写还有个更好的StreamWriter/和StreamReader.下一节将继续介绍.
FielStream类操作的是字节和字节数组,字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。
FielStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。
FileStream只能处理原始字节(raw byte),处理原始字节的功能使用FileStream类可以用于处理任何数据文件
一. FileStream详解
1. (FileStream fs1 = File.Open("c:\\test.txt", FileMode.Open));
FileMode.Open 直接用FileStream类打开文件c:\\test.txt",
2. (FileStream fs2 = File.Open("c:\\test.txt", FileMode.Append, FileAccess.Write));
FileMode.Append,以追加的方式打开文件"c:\\test.txt",将某些内容写到"c:\\test.txt"里.
3.(FileStream fs3 =File.Open("c:\\test.txt", FileMode.Truncate, FileAccess.ReadWrite, FileShare.Read)).
FileMode.Truncate的意思是将文件打开清空里面的内容后再对文件进行操作..
4. FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create);
这个方法的意思是创建一个可以读写的文件,并且可以允许其他人读取文件的内容.
二. C#基于流的输入输出.
C#基于流的输入输出.:Stream-通过C# I/O 系统与物理设备连接起来,也就是平时读写的硬盘等物理存贮设备.流/Stream的方法和属性有:
Method/ Properties 描述
void Close() 关闭流
void Flush() 清理流中的内容
int ReadByte() 返回一个整数表示输入的字节数,如果没有数据返回-1
int Read(byte[ ] buf,int offset, int numBytes) 将numBytes个字节读入到byte[ ]的以offset为,起始位置,返回读入成功的字节数
Long Seek(long offset,SeekOrigin origin) 将当前位置定位到以origin为初始位置以后的offset处.
void WriteByte(byte b) 将单个字节写入到一个输出流.
void Write(byte[ ] buf,int offset, int numBytes) 写入byte[ ] buf中从offset开始的numBytes个字节.
bool CanRead 是否可读
bool CanSeek 是否支持寻址
bool CanWrite 是否可以写入数据
long Length 流的长度
long Position 流的当前位置.
三. 流的继承结构
Stream是一个很大类的,在读写文件的时候,可以通过不同的流进行专业的数据读写.
The FileMode and FileAccess的几条规则:
Value 意义
FileMode.Create 创建文件,之前存在同名的文件将被毁掉
FileMode.CreateNew 创建新文件,这个文件之前不存在
FileMode.Open 打开已经存在的文件
FileMode.OpenOrCreate 打开文件如果存在,否则创建新文件
FileMode.Truncate 打开以存在的文件,将它的内容清除掉
FileMode.Append 以追加的形式将数据写入到文件的最后
如果在打开文件的时候想限制文件访问权限,那么可以做如下的构造方法:
FileStream(string filename, FileMode mode, FileAccess access);
文件名 文件模式 操作模式
Access可以是以下当中的一个值:
FileAccess.Read/ FileAccess.Write/ FileAccess.ReadWrite;
FileStreamfs=new FileStream(“c:\\tab.txt”,FileMode.OpenOrCreate,FileAccess.Read);
C#中的StreamReader/StreamWriter
在读写文件的过程中,Filestream只可以进行以字节为单位原始数据流进行读写操作,为此,C#中提供了功能更加强大的StreamReader/ StreamWriter来支持文件的读写. StreamReader/ StreamWriter可以进行以字符为单位的数据读写操作..
一. 用StreamReader的构造函数
StreamReader有很多的构造函数:在这里只列出两个常用和比较常见的
StreamReader sr=new StreamReader (Stream); Stream可以是Filestream;
StreamReader sr=new StreamReader (String); String为指定的文件名初始化 StreamReader 类的新实例。
例如:
//demo1
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamReader sr = new StreamReader(filest);
//demo2
StreamReader another = new StreamReader(@"c:\abc.txt");
两个StreamReader都指向同一个文件.
StreamReader读取文件中的数据的代码:
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);
StreamReader sr = new StreamReader(filest);
string strLine = sr.ReadLine();//读取文件中的一行
while(strLine!=null)//判断是否为空,表示到文件最后一行了
{
Console.WriteLine(strLine);
strLine = sr.ReadLine();
}
sr.Close();//关闭流
filest.Close();
程序运行结果和盘中abc.txt文件中的内容比较如下:
二. StreamWriter
StreamWriter 专门用于的向文件中写数据的,它和StreamReader类似,只是一个负责向文件中写数据,一个负责向文件中读数据而已.
StreamWriter 构造函数也有很多.在这里只举例两个构造函数.
StreamWriter sr=new StreamWriter (Stream); Stream可以是Filestream;
StreamWriter sr=new StreamWriter (String); String为指定的文件名初始化StreamWriter 类的新实例。
例如:
//demo1
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter (filest);
//demo2
StreamWriter another = new StreamWriter (@"c:\abc.txt");下面的例子可以让大家掌握写文件的方法.
FileStream filewriter = new FileStream(@"C:\abc.txt", FileMode.Append, FileAccess.Write);
以追加的方式打开文件,并进行写入操作.
StreamWriter sw = new StreamWriter(filewriter); 构造函数;
for (char mychar = 'a'; mychar <= 'z'; mychar++)
{
sw.Write(mychar);//将从a—z26个小写字母写入文件中.
}
sw.Close();filewriter.Close();
//demo
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);
StreamReader sr = new StreamReader(filest);
string strLine = sr.ReadLine();
while(strLine!=null)
{
Console.WriteLine(strLine);
strLine = sr.ReadLine();
}
sr.Close();
filest.Close();
这篇主要介绍几个操作文件流的类,读写类StreamReader,StreamWriter和File类以及Directory类的操作
FileStream类的控制
(1) Flush(); 清除此流的缓冲区,是为了保护硬盘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
static void Main(string[] args) { using (FileStream filewrite = new FileStream("file.txt", FileMode.Create, FileAccess.Write)) { filewrite.WriteByte(101); filewrite.WriteByte(101); //清除此流的缓冲区 filewrite.Flush(); filewrite.WriteByte(101); filewrite.WriteByte(101); //每次写一个直接就会频繁的操作硬盘, } } |
(2)Seek(偏移,位置枚举)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
static void Main(string[] args) { using (FileStream fileRead = new FileStream("file.txt", FileMode.Open, FileAccess.Read)) { fileRead.Position = 4; fileRead.Seek(3, SeekOrigin.Current); int n = fileRead.ReadByte(); Console.WriteLine((char)n); } |
其它流
(1)MemoryStream 内存流
NetworkStream ns = new NetworkStream();
(2)NetworkStream 网络流
MemoryStream ms = new MemoryStream();
读写流
(1) StreamReader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//读取文件流 static void Main(string[] args) { using(FileStream fileRead=new FileStream("成功.txt",FileMode.Open,FileAccess.Read)) { using (StreamReader sr = new StreamReader(fileRead,Encoding.Default)) { //第一种读法 //string str = sr.ReadLine(); //while ((str = sr.ReadLine()) != null) //{ // Console.WriteLine(str); //} //第二种读法 Console.WriteLine(sr.ReadToEnd()); |